1. 程式人生 > >leetcode 134 解析

leetcode 134 解析

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 解析