【Leetcode 每日一题】2412. 完成所有交易的初始最少钱数

问题背景

给你一个下标从 0 0 0 开始的二维整数数组 t r a n s a c t i o n s transactions transactions,其中 t r a n s a c t i o n s [ i ] = [ c o s t i , c a s h b a c k i ] transactions[i] = [cost_i, cashback_i] transactions[i]=[costi,cashbacki]
数组描述了若干笔交易。其中每笔交易必须以 某种顺序 恰好完成一次。在任意一个时刻,你有一定数目的钱 m o n e y money money,为了完成交易 i i i m o n e y > = c o s t i money >= cost_i money>=costi 这个条件必须为真。执行交易后,你的钱数 m o n e y money money 变成 m o n e y − c o s t i + c a s h b a c k i money - cost_i + cashback_i moneycosti+cashbacki
请你返回 任意一种 交易顺序下,你都能完成所有交易的最少钱数 m o n e y money money是多少。

数据约束

  • 1 ≤ t r a n s a c t i o n s . l e n g t h ≤ 1 0 5 1 \le transactions.length \le 10 ^ 5 1transactions.length105
  • t r a n s a c t i o n s [ i ] . l e n g t h = 2 transactions[i].length = 2 transactions[i].length=2
  • 0 ≤ c o s t i , c a s h b a c k i ≤ 1 0 9 0 \le cost_i, cashback_i \le 10 ^ 9 0costi,cashbacki109

解题过程

自己思考的时候是打算排序的,实际上用贪心思想分析清楚情况之后只需要 O ( N ) O(N) O(N) 这个量级的时间就能结局问题,记 t o t a l L o s s totalLoss totalLoss 为所有亏钱的情况累计亏损的总金额。

  • 初始最少钱数(也就是结果) r e s res res 应当满足 r e s − t o t a l L o s s ≥ c o s t res - totalLoss \ge cost restotalLosscost,其中 c o s t cost cost 是下一笔(也是赚钱的第一笔)交易的花费,化简的结果为 r e s ≥ t o t a l L o s s + c o s t res \ge totalLoss + cost restotalLoss+cost
  • 亏钱的交易本身也要保证计算 t o t a l L o s s totalLoss totalLoss 的过程中,这些交易能够正常进行。考虑最后一笔亏钱的生意, r e s − ( t o t a l L o s s − ( c o s t − c a s h b a c k ) ) ≥ c o s t res - (totalLoss - (cost - cashback)) \ge cost res(totalLoss(costcashback))cost,化简的结果为 r e s ≥ t o t a l L o s s + c a s h b a c k res \ge totalLoss + cashback restotalLoss+cashback

而赚钱还是亏钱,可以通过比较 c o s t cost cost c a s h b a c k cashback cashback 的大小关系得到,将这个条件的表达式分别代入上述两种情形,最终会发现, r e s res res 只要达到 ( t o t a l L o s s + m i n ( c o s t , c a s h b a c k ) ) (totalLoss + min(cost,cashback)) (totalLoss+min(cost,cashback))即可。

具体实现

class Solution {
    public long minimumMoney(int[][] transactions) {
        long totalLoss = 0;
        int max = 0;
        for (int[] transaction : transactions) {
            totalLoss += Math.max(transaction[0] - transaction[1], 0);
            max = Math.max(max, Math.min(transaction[0],  transaction[1]));
        }
        return totalLoss + max;
    }
}

你可能感兴趣的:(Leetcode,Daily,leetcode,算法,数据结构)