Leetcode 134. 加油站 解题思路及C++实现
方法一:直接暴力方法
解題思路:
當(dāng) gas[i] >= cost[i] 時,這個加油站才可能是個出發(fā)點,遍歷gas容器(數(shù)組),當(dāng)出現(xiàn) gas[i] >= cost[i] 時,看看以這個加油站為出發(fā)點,是否滿足條件,即執(zhí)行函數(shù)whetherEnough,如果滿足,就得到結(jié)果了,返回索引 i 即可,否則,繼續(xù)尋找下一個可能的出發(fā)點。
在whetherEnough函數(shù)中,因為是個環(huán)形線路,所以先訪問 i 后面的加油站,再訪問 i 前面的加油站。中途一旦遇到剩余的油量為負(fù),則這條路不通,返回false。
class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {//遍歷gas和cost,gas[i] >= cost[i]的時候,i才可能為出發(fā)的加油站編號for(int i = 0; i < gas.size(); i++){if(gas[i] >= cost[i]){ //可能是個出發(fā)點if(whetherEnough(i, gas, cost)) return i;}}return -1;}bool whetherEnough(int n, const vector<int> gas, const vector<int> cost){//輸入的i為出發(fā)站, 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容器(數(shù)組),分別要做兩件事情:一是用變量save來記錄剩余油量;二是要找到油量從負(fù)變?yōu)檎募佑驼军c,即要用start來記錄出發(fā)加油站點。
我們思考一下為什么會讓出發(fā)站點放在中間,就是因為前面的數(shù),gas加起來要小于cost,消耗多于供給。而起點后面的加油站,總供給要多于消耗,這樣才能走完整個環(huán)路。
如果前面的加油站中,debt累加起來是正值,說明之前記錄的start位置沒有問題,如果出現(xiàn)了debt為負(fù)值,說明前面的加油站供給不足,要更新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;} };?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Leetcode 134. 加油站 解题思路及C++实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 860. 柠檬水找零
- 下一篇: Leetcode 376. 摆动序列 解