题目描述:
给你一个下标从 0 开始的二维整数数组 transactions
,其中transactions[i] = [costi, cashbacki]
。
数组描述了若干笔交易。其中每笔交易必须以 某种顺序 恰好完成一次。在任意一个时刻,你有一定数目的钱 money
,为了完成交易 i
,money >= costi
这个条件必须为真。执行交易后,你的钱数 money
变成 money - costi + cashbacki
。
请你返回 任意一种 交易顺序下,你都能完成所有交易的最少钱数money
是多少。
代码思路:
- 初始化变量 :
n
:交易记录的总数。lossMax
:这个变量在代码中实际上没有使用,可能是原设计中的一个遗留或误解。根据题目,我们不需要记录最大的亏损额。profitMax
:用于记录在所有亏损交易中(即costi > cashbacki
),最大的costi
值。这个值在后续计算中用来评估,如果所有交易都要进行,且我们需要通过某种方式"回补"亏损时,可能需要的最大初始资金。lossSum
:实际上记录的是所有盈利交易(costi < cashbacki
)转化为亏损后的总和(即cashbacki - costi
的相反数,但在这里直接累加了costi - cashbacki
,表示需要额外补充的资金)。这个值代表了如果直接按顺序进行交易,我们需要额外多少资金来填补这些"亏损"。lossBackMax
:记录所有盈利交易中的最大cashbacki
值。这个值用于评估,如果所有交易都要进行,且我们需要通过最大盈利来"回补"亏损时,可能得到的最大金额。
- 遍历交易记录 :
- 对于每个交易,检查
costi
是否小于cashbacki
:- 如果是(即交易是盈利的),则计算该交易导致的"亏损"(实际上是需要额外补充的资金),并将其加到
lossSum
上。同时,更新lossBackMax
为当前遇到的最大cashbacki
值。 - 如果不是(即交易是亏损的),则更新
profitMax
为当前遇到的最大costi
值。这是因为,如果我们要通过盈利来"回补"这个亏损,我们需要确保初始资金至少能覆盖这个最大的costi
。
- 如果是(即交易是盈利的),则计算该交易导致的"亏损"(实际上是需要额外补充的资金),并将其加到
- 对于每个交易,检查
- 计算最少初始资金 :
- 最后,我们有两种策略来计算所需的最少初始资金:
- 使用所有盈利交易的总和(即
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)