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)
相关推荐
单车少年ing9 分钟前
一个编码BUG
算法·bug
努力中的编程者9 分钟前
哈希表(C语言底层实现)
c语言·数据结构·c++·算法·哈希算法·散列表
CoovallyAIHub22 分钟前
ICLR 2026 | MRAD:不拟合直接查表,零样本工业缺陷检测新范式,16 数据集均值最优
深度学习·算法·计算机视觉
摆烂小白敲代码22 分钟前
【数据结构与算法】汉诺塔问题(C++)
c语言·开发语言·数据结构·c++·算法·hanoi·汉诺塔问题
Trouvaille ~27 分钟前
【递归、搜索与回溯】专题(八):记忆化搜索——从暴力递归到动态规划的桥梁
c++·算法·leetcode·青少年编程·面试·蓝桥杯·动态规划
Sincerelyplz32 分钟前
【LeetForge】我用AI写了一个 LeetCode 刷题自动追踪工具,从此告别手动打卡
leetcode·cursor
Pu_Nine_936 分钟前
深入理解 ES6 Map 数据结构:从理论到实战应用
前端·javascript·数据结构·es6
飞Link1 小时前
降维打击聚类难题:高斯混合模型 (GMM) 深度解析与实战
人工智能·算法·机器学习·数据挖掘·聚类
沐苏瑶1 小时前
Java数据结构-LinkedList与链表
java·数据结构·链表