Leetcode2412:完成所有交易的初始最少钱数

题目描述:

给你一个下标从 0 开始的二维整数数组 transactions,其中transactions[i] = [costi, cashbacki]

数组描述了若干笔交易。其中每笔交易必须以 某种顺序 恰好完成一次。在任意一个时刻,你有一定数目的钱 money ,为了完成交易 imoney >= costi 这个条件必须为真。执行交易后,你的钱数 money 变成 money - costi + cashbacki

请你返回 任意一种 交易顺序下,你都能完成所有交易的最少钱数money 是多少。

代码思路:

  1. 初始化变量
    • n:交易记录的总数。
    • lossMax:这个变量在代码中实际上没有使用,可能是原设计中的一个遗留或误解。根据题目,我们不需要记录最大的亏损额。
    • profitMax:用于记录在所有亏损交易中(即costi > cashbacki),最大的costi值。这个值在后续计算中用来评估,如果所有交易都要进行,且我们需要通过某种方式"回补"亏损时,可能需要的最大初始资金。
    • lossSum:实际上记录的是所有盈利交易(costi < cashbacki)转化为亏损后的总和(即cashbacki - costi的相反数,但在这里直接累加了costi - cashbacki,表示需要额外补充的资金)。这个值代表了如果直接按顺序进行交易,我们需要额外多少资金来填补这些"亏损"。
    • lossBackMax:记录所有盈利交易中的最大cashbacki值。这个值用于评估,如果所有交易都要进行,且我们需要通过最大盈利来"回补"亏损时,可能得到的最大金额。
  2. 遍历交易记录
    • 对于每个交易,检查costi是否小于cashbacki
      • 如果是(即交易是盈利的),则计算该交易导致的"亏损"(实际上是需要额外补充的资金),并将其加到lossSum上。同时,更新lossBackMax为当前遇到的最大cashbacki值。
      • 如果不是(即交易是亏损的),则更新profitMax为当前遇到的最大costi值。这是因为,如果我们要通过盈利来"回补"这个亏损,我们需要确保初始资金至少能覆盖这个最大的costi
  3. 计算最少初始资金
    • 最后,我们有两种策略来计算所需的最少初始资金:
      • 使用所有盈利交易的总和(即lossSum,但实际上是亏损的总和,表示需要额外补充的资金)加上最大亏损交易的买入价(profitMax),这表示我们直接用初始资金覆盖最大亏损,然后用盈利来填补其他亏损。
      • 或者,使用所有盈利交易的总和(lossSum)加上最大盈利交易的卖出价(lossBackMax),这表示我们尝试用盈利来"回补"部分或全部亏损,然后用初始资金来覆盖剩余的部分。
    • 我们取这两种策略中的较大值作为结果,因为题目要求的是"任意一种交易顺序下,你都能完成所有交易的最少钱数"。这意味着我们需要考虑最坏情况下所需的资金。

代码实现:

class Solution:
    def minimumMoney(self, transactions: List[List[int]]) -> int:
        n = len(transactions)
        lossMax = profitMax = lossSum = lossBackMax = 0
        for i in range(0, n, 1):
            if transactions[i][0] - transactions[i][1] < 0 :
                profitMax = max(profitMax, transactions[i][0])
            else:
                lossBackMax = max(lossBackMax, transactions[i][1])
                lossSum += transactions[i][0] - transactions[i][1]
        return max(lossSum + profitMax, lossSum + lossBackMax)
相关推荐
别NULL1 分钟前
机试题——最小矩阵宽度
c++·算法·矩阵
珊瑚里的鱼2 分钟前
【单链表算法实战】解锁数据结构核心谜题——环形链表
数据结构·学习·程序人生·算法·leetcode·链表·visual studio
无限码力6 分钟前
[矩阵扩散]
数据结构·算法·华为od·笔试真题·华为od e卷真题
gentle_ice6 分钟前
leetcode——矩阵置零(java)
java·算法·leetcode·矩阵
查理零世8 分钟前
保姆级讲解 python之zip()方法实现矩阵行列转置
python·算法·矩阵
zhbi9828 分钟前
测量校准原理
算法
时间很奇妙!44 分钟前
decison tree 决策树
算法·决策树·机器学习
sysu631 小时前
95.不同的二叉搜索树Ⅱ python
开发语言·数据结构·python·算法·leetcode·面试·深度优先
红鲤鱼遇绿鲤鱼1 小时前
uva 1354 Mobile Computing
算法
‘’林花谢了春红‘’2 小时前
Leetcode::3432. 统计元素和差值为偶数的分区方案
算法·leetcode·职场和发展