日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Leetcode 134. 加油站 解题思路及C++实现

發布時間:2025/4/16 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 134. 加油站 解题思路及C++实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方法一:直接暴力方法

解題思路:

當 gas[i] >= cost[i] 時,這個加油站才可能是個出發點,遍歷gas容器(數組),當出現 gas[i] >= cost[i] 時,看看以這個加油站為出發點,是否滿足條件,即執行函數whetherEnough,如果滿足,就得到結果了,返回索引 i 即可,否則,繼續尋找下一個可能的出發點。

在whetherEnough函數中,因為是個環形線路,所以先訪問 i 后面的加油站,再訪問 i 前面的加油站。中途一旦遇到剩余的油量為負,則這條路不通,返回false。

class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {//遍歷gas和cost,gas[i] >= cost[i]的時候,i才可能為出發的加油站編號for(int i = 0; i < gas.size(); i++){if(gas[i] >= cost[i]){ //可能是個出發點if(whetherEnough(i, gas, cost)) return i;}}return -1;}bool whetherEnough(int n, const vector<int> gas, const vector<int> cost){//輸入的i為出發站, int i = n;int save = 0;while(i < gas.size()){save += (gas[i] - cost[i]);if(save < 0) return false;else i++;}for(int j = 0; j < i; j++){save += (gas[j] - cost[j]);if(save < 0) return false;}return true;} };

?

方法二:有點技巧

解題思路:

遍歷gas容器(數組),分別要做兩件事情:一是用變量save來記錄剩余油量;二是要找到油量從負變為正的加油站點,即要用start來記錄出發加油站點。

我們思考一下為什么會讓出發站點放在中間,就是因為前面的數,gas加起來要小于cost,消耗多于供給。而起點后面的加油站,總供給要多于消耗,這樣才能走完整個環路。

如果前面的加油站中,debt累加起來是正值,說明之前記錄的start位置沒有問題,如果出現了debt為負值,說明前面的加油站供給不足,要更新start變量。

class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int start = 0;int save = 0;int debt = 0;for(int i = 0; i < gas.size(); i++){save += gas[i] - cost[i];debt += gas[i] - cost[i];if(debt < 0){start = i + 1;debt = 0;}}if(save >= 0) return start;else return -1;} };

?

?

?

?

總結

以上是生活随笔為你收集整理的Leetcode 134. 加油站 解题思路及C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。