此题的思路与跳跃游戏二中的思路类似,都是求最小跳跃次数,用贪心的思想
https://blog.csdn.net/weixin_44343355/article/details/128775970
class Solution {
public:
int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
if(stations.size() == 0){
if(target > startFuel) return -1;
else return 0;
}
// if(stations.size() == 1){
// if(target < startFuel) return 0;
// else if(stations[0][0] > startFuel || (stations[0][1]+startFuel) < target) return -1;
// else return 1;
// }
int leftFuel = startFuel;//剩余油量
priority_queue<int, vector<int>, less<int>> maxFuel;//途中站点的最大油量,加过油的站点就不能再加油了,所以用 堆来存储,依次输出最大站点
int addFuelTimes = 0;//加油次数
int i = 0;
int maxfuel = 0;
vector<int> target_vector;
target_vector.push_back(target);
target_vector.push_back(0);
stations.push_back(target_vector);
for(i = 0; i< stations.size(); i++){
//cout<< "i="<<i<<" ";
leftFuel = startFuel - stations[i][0];//剩余油量
//剩余油量小于等于0,则表明过程中需要加一次油
//无法到达该点,先加油
while(leftFuel < 0 && maxFuel.size()>0){
maxfuel = maxFuel.top();
maxFuel.pop();
leftFuel = leftFuel + maxfuel;
startFuel = startFuel +maxfuel;
addFuelTimes ++;
}
if(leftFuel<0) return -1;
maxFuel.push(stations[i][1]);
//前面所有站点的油都加完了,如果还到不了该点,返回无法到达
//cout<<endl;
}return addFuelTimes;
}
};