Leetcode 134. 加油站 解题思路及C++实现
生活随笔
收集整理的這篇文章主要介紹了
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++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 860. 柠檬水找零
- 下一篇: Leetcode 376. 摆动序列 解