LeetCode 2412. 完成所有交易的初始最少钱数

2412. 完成所有交易的初始最少钱数

 

LeetCode 2412. 完成所有交易的初始最少钱数_第1张图片

【贪心】假设启动资金位money。

那么money >=(a0 - b0) + (a1 - b1) + (a2 - b2) + ...(ai-1 - bi-1) + ai,也就是最后一个的我们可以不考虑他的cashback,如果我们以这个来枚举的话,ai这一项就固定了,再看前面,为了使得money最大,我们把a - b < 0(也就是不亏损的)都不要,相当于把他们都放在了ai的后面。

换句话来说,对于某一项投资来说,他之前剩下的最少的钱就是把所有除了他之外亏损的都亏了。这样的话枚举每一项投资,求money的最大值就行了。

具体地,先求出所有的总和,遍历投资项目的过程中,如果当前也是亏损的,就先从总的里面抠出去,然后再加上他的消耗。其他的就在总和基础上加上消耗就行了。

class Solution {

    // 贪心
    // money >= (b0-a0) + (b1 - a1) + ... + (bi-1 - ai-1) + ai

    public long minimumMoney(int[][] transactions) {
        long ans = 0L;
        long sum = 0L;
        for (var t: transactions) {
            if (t[0] > t[1]) sum += t[0] - t[1];
        } 
        for (var t: transactions) {
            if (t[0] > t[1]) ans = Math.max(sum - (t[0] - t[1]) + t[0], ans) ;
            else ans = Math.max(sum + t[0], ans);
        }
        return ans;
    }
}
class Solution {
public:

    // 贪心+前缀和
    // 9:48

    long long minimumMoney(vector>& transactions) {
        long sum = 0;
        for (auto t: transactions) {
            if (t[0] - t[1] > 0) sum += t[0] - t[1];
        }
        long ans = 0;
        for (auto t: transactions) {
            if (t[0] - t[1] > 0) ans = max(ans, sum - (t[0] - t[1]) + t[0]);
            else ans = max(ans, sum + t[0]);
        }
        return ans;
    }
};

 

 

你可能感兴趣的:(LeetCode,leetcode,前缀和,贪心)