Skip to content

Commit c230109

Browse files
authored
Merge pull request apachecn#60 from yudaer/master
Created 871._Minimum_Number_of_Refueling_Stops.md
2 parents 0309ef1 + c05cbd1 commit c230109

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
### 871. Minimum Number of Refueling Stops
2+
3+
4+
5+
题目:
6+
https://leetcode.com/problems/minimum-number-of-refueling-stops/
7+
8+
难度:
9+
Hard
10+
11+
题意:
12+
13+
1. 一辆车要从start跑到target,带着fuel单位的油
14+
2. 中间有很多个加油站,给定加油站的坐标和油量。到了加油站你可以选择到站加油和直接过站
15+
3. 求最少需要停几个加油站
16+
17+
思路:
18+
19+
- 看起来是不是跟403的Frog jump很像啊,看数据范围,确实也是个动态规划的题目,动态规划的解法留给大家做,这里说一个更简单的方法
20+
- 我们可以换种思路。每次到站之后,把所有加油站的油都带上。先不加,等到有需要的时候再加。如果发现不够油到下个加油站,那么我们就优先选择油多的加油站的油来加,相当于我们在那个加油站停了。这里为什么优先选择油多的加油站呢?因为油多也是一站,油少也是一站。
21+
- 如果把所有的油加满都达不到下个加油站,那么,输出-1
22+
- 如果可以到target之后,我们就输出加了多少个加油站的油即可
23+
- 中间那部分,优先选择油多,我们需要维护一个优先队列(即最大堆),复杂度o(nlogn),当然按照数据范围,就算是用一个链表啊,数组啊,o(n^2)照样能过,这道题的数据范围出错了,应该是stations.length<=100000
24+
- 这种算法叫贪心
25+
26+
代码:
27+
28+
```java
29+
class Solution {
30+
private int runTo(int start, int fuel, int target, PriorityQueue<Integer> queue) {
31+
fuel -= target - start;
32+
while (fuel < 0) {
33+
Integer top = queue.poll();
34+
if (top == null) {
35+
return -1;
36+
}
37+
fuel += top;
38+
}
39+
return fuel;
40+
}
41+
42+
public int minRefuelStops(int target, int startFuel, int[][] stations) {
43+
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
44+
@Override
45+
public int compare(Integer o1, Integer o2) {
46+
return -Integer.compare(o1, o2);
47+
}
48+
});
49+
int start = 0;
50+
int fuel = startFuel;
51+
52+
for (int i = 0;i < stations.length;i++) {
53+
fuel = runTo(start, fuel, stations[i][0], queue);
54+
if (fuel == -1) {
55+
return fuel;
56+
}
57+
queue.add(stations[i][1]);
58+
start = stations[i][0];
59+
}
60+
61+
if (runTo(start, fuel, target, queue) != -1) {
62+
return stations.length - queue.size();
63+
} else {
64+
return -1;
65+
}
66+
}
67+
}
68+
```
69+

0 commit comments

Comments
 (0)