题目
题目给了我们砖块和梯子,梯子可以直接翻上下一座建筑,所以梯子就相当于是可以使用一次的无限块砖块,那么怎么使用梯子显然是这道题的关键。
核心思路
既然梯子是关键,那么我们该怎么使用梯子才能走的更远呢?
因为梯子的数量是固定的,那么如果用完梯子还能剩下尽量多的砖块,就可以走的尽可能远了。所以我们不妨使用一个小顶堆存储所有放梯子的位置梯子所代替的砖块的数量。这样堆顶存放的就是梯子代替的最少的砖块的数量。思路如下:
- 优先使用梯子
- 梯子用完之后用砖块顶替最少位置的梯子,然后把梯子挪到当前位置(尽可能省下砖块)
- 哪怕省下尽可能多的砖块也无法继续前进时,直接返回当前位置
完整代码
class Solution {
public int furthestBuilding(int[] h, int bricks, int ladders) {
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
for (int i = 0; i < h.length - 1; i++) {
if(h[i + 1] > h[i]){
int diff = h[i + 1] - h[i];
minHeap.add(diff);
if(minHeap.size() > ladders){
bricks -= minHeap.poll();
}
if(bricks < 0) return i;
}
}
return h.length - 1;
}
}
这道题难度不算大,主要要想到堆的使用,然而我比赛时还是太菜,都没来得及做这题,只能下次继续努力了~
如果文章有写的不正确的地方还请指出,感恩相遇~~~
网友评论