Leetcode#134 Gas station


原題地址

 

非常經典的一道題。可以轉換成求最大連續和做,但是有更簡單的方法。基於一個數學定理:

如果一個數組的總和非負,那么一定可以找到一個起始位置,從他開始繞數組一圈,累加和一直都是非負的

(證明貌似不難,以后有時間再補)

有了這個定理,判斷到底是否存在這樣的解非常容易,只需要把全部的油耗情況計算出來看看是否大於等於0即可。

那么如何求開始位置在哪?

注意到這樣一個現象:

1. 假如從位置i開始,i+1,i+2...,一路開過來一路油箱都沒有空。說明什么?說明從i到i+1,i+2,...肯定是正積累。
2. 現在突然發現開往位置j時油箱空了。這說明什么?說明從位置i開始沒法走完全程(廢話)。那么,我們要從位置i+1開始重新嘗試嗎?不需要!為什么?因為前面已經知道,位置i肯定是正積累,那么,如果從位置i+1開始走更加沒法走完全程了,因為沒有位置i的正積累了。同理,也不用從i+2,i+3,...開始嘗試。所以我們可以放心地從位置j+1開始嘗試。

 

代碼:

 1 int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
 2   int start = 0; // 起始位置
 3   int remain = 0; // 當前剩余燃料
 4   int debt = 0; // 前面沒能走完的路上欠的債
 5 
 6   for (int i = 0; i < gas.size(); i++) {
 7     remain += gas[i] - cost[i];
 8     if (remain < 0) {
 9       debt += remain;
10       start = i + 1;
11       remain = 0;
12     }
13   }
14 
15   return remain + debt >= 0 ? start : -1;
16 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM