我們可以用的有 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; } };