完成所有交易的初始最少钱数
难度:
标签:
题目描述
代码结果
运行时间: 108 ms, 内存: 54.8 MB
// 思路:同上,利用Java Stream API实现
import java.util.*;
import java.util.stream.*;
public class Solution {
public int minimumMoney(int[][] transactions) {
List<int[]> gainMoney = Arrays.stream(transactions)
.filter(t -> t[1] >= t[0])
.sorted(Comparator.comparingInt(t -> t[0]))
.collect(Collectors.toList());
List<int[]> loseMoney = Arrays.stream(transactions)
.filter(t -> t[1] < t[0])
.sorted((a, b) -> Integer.compare(b[0] - b[1], a[0] - a[1]))
.collect(Collectors.toList());
int money = 0;
int maxCost = 0;
for (int[] transaction : gainMoney) {
money = Math.max(money, maxCost + transaction[0]);
maxCost = Math.max(maxCost, maxCost + transaction[0] - transaction[1]);
}
for (int[] transaction : loseMoney) {
money = Math.max(money, maxCost + transaction[0]);
maxCost = Math.max(maxCost, maxCost + transaction[0] - transaction[1]);
}
return money;
}
}
解释
方法:
该题解采用了一个贪心策略,分析所有交易并计算在最坏情况下完成所有交易需要的最少起始资金。它遍历所有交易,如果交易的成本大于返现(c > cb),则意味着你在这笔交易后会亏损 'c - cb' 的金额。因此,累加所有这样的亏损值到 'need' 变量。同时更新 'm' 为所有交易中的 'cb' 的最大值或成本 'c' 的最大值,取决于交易是否产生亏损。最终,你需要的最少起始资金是累积的亏损加上 'm',这样确保无论交易顺序如何,你都有足够的资金来应对最差情况。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
题解中的贪心策略是基于什么理论或假设?为何累加亏损值和最大返现或成本值就能确保完成所有交易?
▷🦆
在题解算法中,为什么选择最大的返现值或成本值作为m的更新依据?这样的策略在哪些情况下可能不是最优的?
▷🦆
算法对于处理交易顺序的灵活性是如何保证的?即如何确保在不同的交易顺序下,计算出的起始资金都是足够的?
▷🦆
题解中提到如果成本高于返现,则累加亏损值`c - cb`,这里的逻辑是否在所有情况下都成立?例如,如果后续交易返现很高怎么办?
▷