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)
相关推荐
草履虫建模14 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq16 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq16 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq17 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)18 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi18 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱19 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头19 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头19 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
咖丨喱20 小时前
IP校验和算法解析与实现
网络·tcp/ip·算法