1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public int furthestBuilding(int[] heights, int bricks, int ladders) {
int ans = 0;
PriorityQueue<Integer> diffQueue = new PriorityQueue<>();
for (int i = 1; i < heights.length; i++) {
int diff = heights[i] - heights[i - 1];
if (diff <= 0) {
ans += 1;
} else {
diffQueue.offer(diff);
if (diffQueue.size() > ladders) {
int minDiff = diffQueue.poll();
bricks -= minDiff;
if (bricks >= 0) {
ans += 1;
} else {
break;
}
} else {
ans += 1;
}
}
}
return ans;
}
}

我们是边走边用梯子, 等到发现梯子没的时候, 我们就需要知道之前走过的buildings中, diff最小的那个是多少, 把那个换成bricks然后我们就又有梯子了. 因此我们用PQ来存遇到的diff中最大的k个, k是梯子的个数, 这k个就用梯子, 其他的就用bricks来走. 等到某个时刻bricks不够用, 此时我们就到了最远的地方, 或者最远的building(最后一个)也被达到了.

时间复杂度: O(nlogk)
空间复杂度: O(k)