C++實現(xiàn)LeetCode(134.加油站問題)
[LeetCode] 134.Gas Station 加油站問題
There are N gas stations along a circular route, where the amount of gas at station i is gas[i].
You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.
Return the starting gas station's index if you can travel around the circuit once, otherwise return -1.
Note:
The solution is guaranteed to be unique.
這道轉(zhuǎn)圈加油問題不算很難,只要想通其中的原理就很簡單。我們首先要知道能走完整個環(huán)的前提是gas的總量要大于cost的總量,這樣才會有起點的存在。假設開始設置起點start = 0, 并從這里出發(fā),如果當前的gas值大于cost值,就可以繼續(xù)前進,此時到下一個站點,剩余的gas加上當前的gas再減去cost,看是否大于0,若大于0,則繼續(xù)前進。當?shù)竭_某一站點時,若這個值小于0了,則說明從起點到這個點中間的任何一個點都不能作為起點,則把起點設為下一個點,繼續(xù)遍歷。當遍歷完整個環(huán)時,當前保存的起點即為所求。代碼如下:
解法一:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int total = 0, sum = 0, start = 0;
for (int i = 0; i < gas.size(); ++i) {
total += gas[i] - cost[i];
sum += gas[i] - cost[i];
if (sum < 0) {
start = i + 1;
sum = 0;
}
}
return (total < 0) ? -1 : start;
}
};
我們也可以從后往前遍歷,用一個變量mx來記錄出現(xiàn)過的剩余油量的最大值,total記錄當前剩余油量的值,start還是記錄起點的位置。當total大于mx的時候,說明當前位置可以作為起點,更新start,并且更新mx。為啥呢?因為我們每次total加上的都是當前位置的油量減去消耗,如果這個差值大于0的話,說明當前位置可以當作起點,因為從當前位置到末尾都不會出現(xiàn)油量不夠的情況,而一旦差值小于0的話,說明當前位置如果是起點的話,油量就不夠,無法走完全程,所以我們不更新起點位置start。最后結(jié)束后我們還是看totoa是否大于等于0,如果其小于0的話,說明沒有任何一個起點能走完全程,因為總油量都不夠,參見代碼如下:
解法二:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int total = 0, mx = -1, start = 0;
for (int i = gas.size() - 1; i >= 0; --i) {
total += gas[i] - cost[i];
if (total > mx) {
start = i;
mx = total;
}
}
return (total < 0) ? -1 : start;
}
};
類似題目:
Cheapest Flights Within K Stops
參考資料:
https://leetcode.com/problems/gas-station/discuss/42568/Share-some-of-my-ideas.
https://leetcode.com/problems/gas-station/discuss/42656/8ms-simple-O(n)-c++-solution
到此這篇關(guān)于C++實現(xiàn)LeetCode(134.加油站問題)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)加油站問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++報錯問題解決方案lvalue required as left opera
這篇文章主要介紹了c++報錯:lvalue required as left operand of assignment,出現(xiàn)此錯誤原因,是因為,等號左邊是不可被修改的表達式或常量,而表達式或常量不能作為左值,需要的朋友可以參考下2023-01-01
Cocos2d-x 3.x入門教程(二):Node節(jié)點類
這篇文章主要介紹了Cocos2d-x 3.x入門教程(二):Node節(jié)點類,本文對Node節(jié)點類做了一個簡明講解及Node類提供的函數(shù)做了說明,需要的朋友可以參考下2014-11-11
c++優(yōu)先隊列(priority_queue)用法詳解
這篇文章主要介紹了c++優(yōu)先隊列(priority_queue)用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12

