871. Minimum Number of Refueling Stops
題目:
A car travels from a starting position to a destination which is?target?miles east of the starting position.
There are gas stations along the way. The gas stations are represented as an array?stations?where?stations[i] = [positioni, fueli]?indicates that the?ith?gas station is?positioni?miles east of the starting position and has?fueli?liters of gas.
The car starts with an infinite tank of gas, which initially has?startFuel?liters of fuel in it. It uses one liter of gas per one mile that it drives. When the car reaches a gas station, it may stop and refuel, transferring all the gas from the station into the car.
Return?the minimum number of refueling stops the car must make in order to reach its destination. If it cannot reach the destination, return?-1.
Note that if the car reaches a gas station with?0?fuel left, the car can still refuel there. If the car reaches the destination with?0?fuel left, it is still considered to have arrived.
Example 1:
Input: target = 1, startFuel = 1, stations = [] Output: 0 Explanation: We can reach the target without refueling.Example 2:
Input: target = 100, startFuel = 1, stations = [[10,100]] Output: -1 Explanation: We can not reach the target (or even the first gas station).Example 3:
Input: target = 100, startFuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]] Output: 2 Explanation: We start with 10 liters of fuel. We drive to position 10, expending 10 liters of fuel. We refuel from 0 liters to 60 liters of gas. Then, we drive from position 10 to position 60 (expending 50 liters of fuel), and refuel from 10 liters to 50 liters of gas. We then drive to and reach the target. We made 2 refueling stops along the way, so we return 2.Constraints:
- 1 <= target, startFuel <= 109
- 0 <= stations.length <= 500
- 0 <= positioni?<= positioni+1?< target
- 1 <= fueli?< 109
思路1:
第一反應是用遞歸來做,f[i][j]表示經過第 i 個加油站后,加油 j 次能夠到達的最大距離,最后只需要找到最小的 j 并且f[i][j]大于等于target即可。狀態轉移方程中f[i][j]可以從三個地方來:1)f[i][j - 1],代表經過了當前車站,但是不在當前車站加油;2)f[i - 1][j],表示到達了第i - 1即前一個車站,并且加了j次油,即上個車站沒加油;3)f[i - 1][j - 1] + stations[i - 1][1],即經過了第i - 1個車站,并且在上個車站加了油,當然這里有條件就是f[i - 1][j - 1]的最大距離必須要比stations[i - 1][0]大,不然無法到達上個車站。初始化我們用 n = stations.size() + 1,即f[i][j]當 j 等于0 時表示f[i][0]都是沒加過油的,那么它們的值應該為startFuel,至于f[0][j],不需要初始化,因為j一定小于等i,即加油次數不能比路過的車站多。
代碼1:
class Solution {
public:
? ? int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
? ? ? ? int n = stations.size() + 1;
? ? ? ? vector<vector<long>> f(n, vector<long>(n));
? ? ? ? for (int i = 0; i < n; i++) {
? ? ? ? ? ? f[i][0] = startFuel;
? ? ? ? } ? ? ?
? ? ? ? for (int i = 1; i < n; i++) {
? ? ? ? ? ? for (int j = 1; j <= i; j++) {
? ? ? ? ? ? ? ? if (f[i - 1][j - 1] >= stations[i - 1][0]) {
? ? ? ? ? ? ? ? ? ? f[i][j] = f[i - 1][j - 1] + stations[i - 1][1];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? f[i][j] = max({f[i - 1][j], f[i][j - 1], f[i][j]});
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? for (int j = 0; j < n; j++) {
? ? ? ? ? ? for (int i = 0; i < n; i++) {
? ? ? ? ? ? ? ? if (f[i][j] >= target)
? ? ? ? ? ? ? ? ? ? return j;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return -1;
? ? }
};
思路2:
從本質上來看,題目要求我們需要在最少的加油次數中加最多的油,即每次加油都加能夠加的最多的油。但是我們每次路過車站,其實只有當前車站可以選擇,那么怎么構成選項呢?答案是每次路過車站先不加油,把能夠加的油記錄進一個優先隊列,等到需要加油的時候我們再取出來為自己加油。這里優先隊列是為了管理最大值,使我們能夠隨時取出來的都是最多的油。首先我們能夠到達的最大距離dist就是startFuel,之后判斷dist和target,一旦dist大于等于target即可結束。循環中,每次我們路過車站,如果當前dist能夠到達車站,那我們就先不加油,而是把油加入優先隊列;如果不能到達車站,那么就加油,如果優先隊列已經無油可加,證明我們不能到達target,直接返回-1;如果優先隊列有油,那么就拿出最大的油,加給dist,同時更新加油次數即可。
代碼2:
class Solution {
public:
? ? int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
? ? ? ? priority_queue<int> q;
? ? ? ? int dist = startFuel, count = 0;
? ? ? ? int i = 0;
? ? ? ? while (dist < target) {
? ? ? ? ? ? if (i < stations.size() && dist >= stations[i][0]) {? //能到車站說明油暫時是夠的
? ? ? ? ? ? ? ? q.push(stations[i][1]);? //先不加油,存起來
? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? if (q.size()) {? //有油可加
? ? ? ? ? ? ? ? ? ? dist += q.top();? ? //加油
? ? ? ? ? ? ? ? ? ? q.pop();
? ? ? ? ? ? ? ? ? ? count++;? //更新次數
? ? ? ? ? ? ? ? } else {? //無油可加,無法到達target
? ? ? ? ? ? ? ? ? ? return -1;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return count;
? ? }
};
總結
以上是生活随笔為你收集整理的871. Minimum Number of Refueling Stops的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5w 字 | 172 图 | 超级赛亚级
- 下一篇: 如何用PDCA循环提高现场管理?