汽車從起點出發駛向目的地,該目的地位於出發位置東面 target
英里處。
沿途有加油站,每個 station[i]
代表一個加油站,它位於出發位置東面 station[i][0]
英里處,並且有 station[i][1]
升汽油。
假設汽車油箱的容量是無限的,其中最初有 startFuel
升燃料。它每行駛 1 英里就會用掉 1 升汽油。
當汽車到達加油站時,它可能停下來加油,將所有汽油從加油站轉移到汽車中。
為了到達目的地,汽車所必要的最低加油次數是多少?如果無法到達目的地,則返回 -1
。
注意:如果汽車到達加油站時剩余燃料為 0,它仍然可以在那里加油。如果汽車到達目的地時剩余燃料為 0,仍然認為它已經到達目的地。
示例 1:
輸入:target = 1, startFuel = 1, stations = [] 輸出:0 解釋:我們可以在不加油的情況下到達目的地。
示例 2:
輸入:target = 100, startFuel = 1, stations = [[10,100]] 輸出:-1 解釋:我們無法抵達目的地,甚至無法到達第一個加油站。
示例 3:
輸入:target = 100, startFuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]] 輸出:2 解釋: 我們出發時有 10 升燃料。 我們開車來到距起點 10 英里處的加油站,消耗 10 升燃料。將汽油從 0 升加到 60 升。 然后,我們從 10 英里處的加油站開到 60 英里處的加油站(消耗 50 升燃料), 並將汽油從 10 升加到 50 升。然后我們開車抵達目的地。 我們沿途在1兩個加油站停靠,所以返回 2 。
思路:如果采用暴力求解,肯定會超時,這里要用貪心的思路,
我們結合下實際情況:我們想象下,車子在還有油時,不斷向前行駛,每遇到一個加油站i時,都把Bi量的油放在車上,注意這並不是給油缸加油,只是相當於放在后備箱了,然后在車子沒有油時,從后備箱選擇一個油量最大的進行加油,這樣不斷重復,在后備箱中已經沒有油,但是還沒到終點,那么就不能到終點了,也就是輸出-1。比較類似貪心,每次選擇一個對當前情況最有利的情況。
在進行選擇后備箱的油時,當然可以使用循環不斷比較后獲得最大油量,可是沒必要,我們可以使用C++的STL庫中的一個數據結構---優先隊列priority_queue,每次把油加入后備箱時,都會自動按int類型鍵值從大到小排序,然后每次從后備箱取油時,會自動返回最大油量.
int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) { //ans表示最后結果,即最小加油次數 //pos表示當前卡車位置 //tank表示油缸中油的數量 //que優先隊列中存放之前能通過的各個加油站的最大加油量Bi priority_queue<pair<int,int> > que; int ans=0,pos=0,tank=startFuel; vector<int> c; c.push_back(target);//這里要把終點也算進去 c.push_back(0);//0代表終點沒有油桶 stations.push_back(c); for(int i=0;i<stations.size();i++) { int curDist=stations[i][0]-pos; //curDist表示到達下一個臨時終點(加油站)的距離 while(curDist>tank) //當前油不夠到下一個終點 { if(que.empty()) { return -1; } pair<int,int> temp=que.top(); que.pop(); tank+=temp.first; //不斷加油,直到能到達下一個終點 ans++; } tank-=curDist; //跑到下一個終點,消耗 curDist數量的油 pos=stations[i][0]; //到達下一個加油站,取得該加油站的油,放在優先隊列中,以便后面使用 que.push(make_pair(stations[i][1],i)); } return ans; }
這里二維vector的插入數據,原理如下:我們在動態申請二維數組vector的時候,一般會用vector<vector<int> >a(4,vector<int>(2));然后再往里面push值。它之所以是二維數組,是因為它把每一行都用vector存儲起來,可以認為a里面存放的是一個個行的vector,而每個vector中push了兩個值。那我們如果要插入一行的話,也要以vector<int>的形式push進去,那需要提前建一個vector,然后往里面打兩個值,再push到我們的二維vector中。