2412. 完成所有交易的初始最少钱数¶
难度:困难
题目¶
给你一个下标从 0 开始的二维整数数组 transactions
,其中transactions[i] = [cost_i, cashback_i]
。
数组描述了若干笔交易。其中每笔交易必须以 某种顺序 恰好完成一次。在任意一个时刻,你有一定数目的钱 money
,为了完成交易 i
,money >= cost_i
这个条件必须为真。执行交易后,你的钱数 money
变成 money - cost_i + cashback_i
。
请你返回 任意一种 交易顺序下,你都能完成所有交易的最少钱数 money
是多少。
示例 1:
输入:
transactions = [[2,1],[5,0],[4,2]]
输出:
10
解释:
刚开始 money = 10 ,交易可以以任意顺序进行。
可以证明如果 money < 10 ,那么某些交易无法进行。
示例 2:
输入:
transactions = [[3,0],[0,3]]
输出:
3
解释:
- 如果交易执行的顺序是 [[3,0],[0,3]] ,完成所有交易需要的最少钱数是 3 。
- 如果交易执行的顺序是 [[0,3],[3,0]] ,完成所有交易需要的最少钱数是 0 。
所以,刚开始钱数为 3 ,任意顺序下交易都可以全部完成。
提示:
1 <= transactions.length <= 10^5
transactions[i].length == 2
0 <= cost_i, cashback_i <= 10^9
题解¶
交易可以被分为两种,即盈利的交易和亏损的交易。在最坏的情况下:
- 先进行亏损的交易,因此不考虑交易的启动资金
cost
,我们的初始资金必须至少覆盖所有亏损交易的亏损金额cost - cashback
,对于没有亏损的盈利交易,亏损金额为0
。 - 以上第一步只考虑了交易的变化,而没有考虑交易的启动条件。如果一个交易被放在了交易顺序的最后一个:
- 如果它是一个亏损交易,交易结束时,剩余的金额必须高于它的
cashback
,否则必然有一步无法启动交易; - 如果它是一个盈利交易,交易开始时的金额必须高于启动交易的条件
cash
;
- 如果它是一个亏损交易,交易结束时,剩余的金额必须高于它的
- 我们只需满足最坏交易的交易条件即可。
使用两个变量total_lose
和init
分别统计总的亏损金额和最坏情况下的启动条件。完成交易需要同时满足这两个条件,即两个数值之和。
class Solution:
def minimumMoney(self, transactions: List[List[int]]) -> int:
total_lose, init = 0, 0
for cost, cashback in transactions:
if cost > cashback:
total_lose += cost - cashback
init = max(init, cashback)
else:
init = max(init, cost)
return total_lose + init