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)
相关推荐
元亓亓亓2 小时前
Java后端开发day36--源码解析:HashMap
java·开发语言·数据结构
酷ku的森3 小时前
数据结构:链表
数据结构·链表
何其有幸.4 小时前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
丶Darling.4 小时前
26考研 | 王道 | 数据结构笔记博客总结
数据结构·笔记·考研
东阳马生架构5 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
老饼讲解-BP神经网络6 小时前
一篇入门之-评分卡变量分箱(卡方分箱、决策树分箱、KS分箱等)实操例子
算法·决策树·机器学习
何其有幸.6 小时前
实验6-3 使用函数求特殊a串数列和(PTA|C语言)
c语言·数据结构·算法
不会计算机的捞地6 小时前
【数据结构入门训练DAY-24】美国大选
数据结构·算法
明月看潮生7 小时前
青少年编程与数学 02-018 C++数据结构与算法 11课题、分治
c++·算法·青少年编程·编程与数学
Echo``7 小时前
2:QT联合HALCON编程—图像显示放大缩小
开发语言·c++·图像处理·qt·算法