C++實(shí)現(xiàn)LeetCode(134.加油站問(wèn)題)
[LeetCode] 134.Gas Station 加油站問(wèn)題
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)圈加油問(wèn)題不算很難,只要想通其中的原理就很簡(jiǎn)單。我們首先要知道能走完整個(gè)環(huán)的前提是gas的總量要大于cost的總量,這樣才會(huì)有起點(diǎn)的存在。假設(shè)開(kāi)始設(shè)置起點(diǎn)start = 0, 并從這里出發(fā),如果當(dāng)前的gas值大于cost值,就可以繼續(xù)前進(jìn),此時(shí)到下一個(gè)站點(diǎn),剩余的gas加上當(dāng)前的gas再減去cost,看是否大于0,若大于0,則繼續(xù)前進(jìn)。當(dāng)?shù)竭_(dá)某一站點(diǎn)時(shí),若這個(gè)值小于0了,則說(shuō)明從起點(diǎn)到這個(gè)點(diǎn)中間的任何一個(gè)點(diǎn)都不能作為起點(diǎn),則把起點(diǎn)設(shè)為下一個(gè)點(diǎn),繼續(xù)遍歷。當(dāng)遍歷完整個(gè)環(huán)時(shí),當(dāng)前保存的起點(diǎ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; } };
我們也可以從后往前遍歷,用一個(gè)變量mx來(lái)記錄出現(xiàn)過(guò)的剩余油量的最大值,total記錄當(dāng)前剩余油量的值,start還是記錄起點(diǎn)的位置。當(dāng)total大于mx的時(shí)候,說(shuō)明當(dāng)前位置可以作為起點(diǎn),更新start,并且更新mx。為啥呢?因?yàn)槲覀兠看蝨otal加上的都是當(dāng)前位置的油量減去消耗,如果這個(gè)差值大于0的話,說(shuō)明當(dāng)前位置可以當(dāng)作起點(diǎn),因?yàn)閺漠?dāng)前位置到末尾都不會(huì)出現(xiàn)油量不夠的情況,而一旦差值小于0的話,說(shuō)明當(dāng)前位置如果是起點(diǎn)的話,油量就不夠,無(wú)法走完全程,所以我們不更新起點(diǎn)位置start。最后結(jié)束后我們還是看totoa是否大于等于0,如果其小于0的話,說(shuō)明沒(méi)有任何一個(gè)起點(diǎn)能走完全程,因?yàn)榭傆土慷疾粔?,參?jiàn)代碼如下:
解法二:
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; } };
類(lèi)似題目:
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++實(shí)現(xiàn)LeetCode(134.加油站問(wèn)題)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)加油站問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(148.鏈表排序)
- C++實(shí)現(xiàn)LeetCode(147.鏈表插入排序)
- C++實(shí)現(xiàn)LeetCode(146.近最少使用頁(yè)面置換緩存器)
- C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)
- C++實(shí)現(xiàn)LeetCode(135.分糖果問(wèn)題)
- C++實(shí)現(xiàn)LeetCode(138.拷貝帶有隨機(jī)指針的鏈表)
- C++實(shí)現(xiàn)LeetCode(133.克隆無(wú)向圖)
- C++實(shí)現(xiàn)LeetCode(149.共線點(diǎn)個(gè)數(shù))
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲操作
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03一起來(lái)看看C++STL容器之string類(lèi)
這篇文章主要為大家詳細(xì)介紹了C++STL容器之string類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03深入詳解C編寫(xiě)Windows服務(wù)程序的五個(gè)步驟
本篇文章介紹了,使用C編寫(xiě)Windows服務(wù)程序的五個(gè)步驟的詳細(xì)概述。需要的朋友參考下2013-05-05vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟
這篇文章主要介紹了vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06vc6.0中c語(yǔ)言控制臺(tái)程序中的定時(shí)技術(shù)(定時(shí)器)
這篇文章主要介紹了vc6.0中c語(yǔ)言控制臺(tái)程序中的定時(shí)技術(shù)(定時(shí)器),需要的朋友可以參考下2014-04-04探討:用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(我作為面試官的小結(jié))
作為面試官的我,經(jīng)常拿這道用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的面試題來(lái)考面試者,通過(guò)對(duì)面試者的表現(xiàn)和反應(yīng),有一些統(tǒng)計(jì)和感受,在此做個(gè)小結(jié)2013-05-05淺談c++性能測(cè)試工具之計(jì)算時(shí)間復(fù)雜度
有時(shí)候除了測(cè)量算法的具體性能指數(shù),我們也會(huì)希望測(cè)試出算法的時(shí)間復(fù)雜度,以便我們對(duì)待測(cè)試的算法的性能有一個(gè)更加直觀的了解。本文將介紹c++性能測(cè)試工具之計(jì)算時(shí)間復(fù)雜度。2021-06-06