class Solution {
public:
int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
const size_t N = stations.size();
// 出发地是从0位置开始出发
int curPos = 0;
//用来存放汽油的队列
priority_queue<int> Q;
// 还剩下多少汽油
int gasLeft = startFuel;
//将要到达那个站
int i = 0;
// 加油的次数
int addGasTimes = 0;
while (curPos + gasLeft < target) {
//默认target设置成最后一站
int curStationPos = target;
int curStationGas = 0;
//如果在target前面还有站,那么需要设置这个站的位置
//以及油量
if (i < N && stations[i][0] <=target) {
curStationPos = stations[i][0];
curStationGas = stations[i][1];
}
//如果当前余下的汽油不足以跑到这个加油站
while (curPos + gasLeft < curStationPos) {
if (Q.empty()) {
return -1;
}
//那么着找出之前加油最多的油来加
//把最多的油加上去
gasLeft += Q.top();
Q.pop();
addGasTimes ++;
}
//向前开的过程中肯定存在油量的消耗
const int gasCost = curStationPos - curPos;
gasLeft -= gasCost;
//把这个加油站的油放入队列中
//但是并不代表加到车里了 知识作为储备用油存到队列里
if (curStationGas > 0) {
Q.push(curStationGas);
}
//过了这个站
i++;
//更新当前车辆的位置
curPos = curStationPos;
}
return curPos + gasLeft >= target? addGasTimes : -1;
}
};
复杂度分析:最差情况下,需要把所有的油都收集起来,此时所有的油都需要有 push 操作,所以时间复杂度为O(NlgN),而空间复杂度为O(N)。