2024年2月17日 星期六

1642. Furthest Building You Can Reach

解題思路

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

2024年2月7日 星期三

C++ 刷題常用模板

 1. 比較

bool cmp(<T>& a, <T>& b)

{

    return a > b;

}

sort(v.begin(), v.end(), cmp());


Note: cmp 裡面 return 的順序等於希望最終長怎樣的條件