我們可以用的有 ladder (無視兩鄉鄰建築物落差) 跟 brick。很直覺的是,我們肯定是把落差最大的那幾次用 ladder,其他幾次用 brick。
所以可以得知下面的公式:
落差總和 - 最大幾次總和 = 剩下來用 brick 補足的 <= 既有 brick 數
求最大幾次(用 ladder 的),可以用 minHeap 來完成,概念可參考 215. Kth Largest Element in an Array 這題。
程式碼
class Solution {
public:
int furthestBuilding(vector<int>& heights, int bricks, int ladders) {
long long int sum = 0, topKSum = 0, i;
priority_queue<int, vector<int>, greater<int>> pq;
for(i=1; i<heights.size(); i++)
{
int diff = heights[i] - heights[i-1];
if(diff > 0)
{
sum += diff;
topKSum += diff;
pq.push(diff);
if(pq.size() > ladders)
{
topKSum -= pq.top();
pq.pop();
}
if(sum - topKSum > bricks)
break;
}
}
return i-1;
}
};