leetcode
leetcode 2101 ~ 2150
完成所有交易的初始最少钱数

完成所有交易的初始最少钱数

难度:

标签:

题目描述

代码结果

运行时间: 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)

代码细节讲解

🦆
题解中的贪心策略是基于什么理论或假设?为何累加亏损值和最大返现或成本值就能确保完成所有交易?
题解中的贪心策略基于假设:在不考虑交易顺序的情况下,确保每次交易后都不导致资金为负。为了满足这一点,我们需要关注两个方面:1)如果成本大于返现的情况,这会导致资金亏损,因此我们累加所有这些亏损值以确保有足够资金覆盖这些亏损。2)独立于亏损,我们还需要考虑单次交易中可能需要的最大资金(无论是成本还是返现)。这样,无论交易顺序如何变化,总能保证有足够的资金来完成所有交易。
🦆
在题解算法中,为什么选择最大的返现值或成本值作为m的更新依据?这样的策略在哪些情况下可能不是最优的?
在算法中选择最大的返现值或成本值更新`m`是为了确保在最坏的单笔交易情况下,你仍然有足够的资金进行交易。这种策略以最坏情况为准,保证了算法的正确性但有时可能会导致资金的冗余,即可能导致计算出的起始资金比实际需要的多。例如,如果所有交易的返现都非常高,那么实际上并不需要额外准备太多资金来进行交易。
🦆
算法对于处理交易顺序的灵活性是如何保证的?即如何确保在不同的交易顺序下,计算出的起始资金都是足够的?
算法通过计算并保留必要的两个最大值:亏损总和和最大单笔交易所需资金(最大成本或返现),来确保交易顺序的灵活性。无论交易的实际执行顺序如何,只要初始资金不少于这两个值的总和,就可以确保始终有足够的资金来应对任何单笔交易以及累积的亏损,从而保持算法的普适性和正确性。
🦆
题解中提到如果成本高于返现,则累加亏损值`c - cb`,这里的逻辑是否在所有情况下都成立?例如,如果后续交易返现很高怎么办?
逻辑`c - cb`累加亏损在考虑到最坏情况下总是成立的,因为它保证了在任何交易中,即使没有足够的返现来抵消成本,你也仍然有足够的资金来处理这个亏损。即使后续交易的返现很高,这种方法依然保持有效,因为它是基于确保每笔交易都不会导致资金变为负数的最坏情况分析。这种策略可能导致对资金的过估计,但从安全性角度来看是保守且合理的。

相关问题