题意:
给你一个整数数组 heights
,表示建筑物的高度。另有一些砖块 bricks
和梯子 ladders
。
你从建筑物 0
开始旅程,不断向后面的建筑物移动,期间可能会用到砖块或梯子。
当从建筑物 i
移动到建筑物 i+1
(下标 从 0 开始 )时:
- 如果当前建筑物的高度 大于或等于 下一建筑物的高度,则不需要梯子或砖块
- 如果当前建筑的高度 小于 下一个建筑的高度,您可以使用 一架梯子 或
(h[i+1] - h[i])
个砖块
如果以最佳方式使用给定的梯子和砖块,返回你可以到达的最远建筑物的下标(下标 从 0 开始 )。
解题思路:
由于梯子可以代替砖块,所以何时使用梯子是关键
那么刚开始先使用梯子,如果梯子用完了,那么就从中(优先队列)取消耗最少的砖块代替梯子。
如果梯子和砖块全部用光,那么退出
代码:
class Solution {
public:
int furthestBuilding(vector<int>& heights, int bricks, int ladders) {
int ans = 0;
priority_queue<int, vector<int>, greater<int>> a;
int n = heights.size();
for(ans = 0; ans < n-1; ans++) {
if(heights[ans+1] > heights[ans]) {
a.push(heights[ans+1]-heights[ans]);
if(a.size() > ladders) { // 当梯子用完
bricks -= a.top(); // 选取消耗最少的砖块填补,那个梯子则可以用来填更大的坑
if(bricks < 0) { // 当梯子和砖块全部用完
break;
}
a.pop();
}
}
}
return ans;
}
};