leetcode 134 解析
阿新 • • 發佈:2019-01-16
com () gas 記錄 最優 最優解 i++ 更換 tor
leetcode 134 解析
在一條環路上有 N 個加油站,其中第 i 個加油站有汽油 gas[i]
升。
你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i+1 個加油站需要消耗汽油 cost[i]
升。你從其中的一個加油站出發,開始時油箱為空。
如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 -1。
說明:
- 如果題目有解,該答案即為唯一答案。
- 輸入數組均為非空數組,且長度相同。
- 輸入數組中的元素均為非負數。
自己的答案,基本算是暴力解法了,雙重循環,不過考慮實際情況大多數都break掉了,測試時間也還好,C++代碼如下:
C++解法一:
1 class Solution {2 public: 3 int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { 4 int re=-1,i=0,j=0; 5 int l=gas.size(); 6 while(re==-1&&i<l){ 7 gas.push_back(gas[i]);//下標每次後移前都把當前下標數目push_back 8 cost.push_back(cost[i]);9 if(gas[i]>=cost[i]){//當前point滿足出發條件進入子循環; 10 int oil=gas[i],m=0; 11 while(m<l-1){ 12 if(oil-cost[i+m]>=0){ 13 oil=oil-cost[i+m]+gas[i+m+1]; 14 m++; 15 }else{ 16 break; 17 } 18 } 19 if((m==l-1)&&(oil-cost[i+m]>=0)){ 20 re=i; 21 break; 22 } 23 } 24 i++; 25 } 26 return re; 27 } 28 };
最優解:
只遍歷一遍,有三個特征量,total,sum,start
start用來記錄起點,也就是最終的返回值;
total用來記錄整個環的gas和cost,即驗證能否滿足走完一圈的最低條件;
sum用來記錄start到當前點是否滿足向前行駛的條件;
時間復雜度只有O(n);
但我總覺得這個程序實際上必須是滿足total>0一定有解,這個解就是sum>0的第一個點的下標;至於為什麽滿足這個條件一定有解,等想明白了再更新;
C++解法二:
1 class Solution { 2 public: 3 int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { 4 int total=0,sum=0,start=0; 5 for(int i=0;i<gas.size();i++){ 6 total+=gas[i]-cost[i];//走完整個環的前提 7 sum+=gas[i]-cost[i];//走完起點到當前點的前提 8 if(sum<0){//當到達某一站點時油不夠了,更換next為新起點 9 start=i+1; 10 sum=0; 11 } 12 13 } 14 return (total<0)? -1 : start; 15 } 16 };
leetcode 134 解析