【力扣每日一题】LeetCode 2412: 完成所有交易的初始最少钱数

ops/2025/2/3 12:03:18/

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

题目解析

问题描述

给定一个二维数组 transactions,每个元素 transactions[i] = [costi, cashbacki] 表示一个交易。对于每笔交易,要求你完成该交易时有足够的初始资金 money,并且交易会减少或增加你账户中的资金。具体地,交易的费用为 costi,交易后的现金返还为 cashbacki。执行交易后,money 会变成 money - costi + cashbacki

你的目标是找到完成所有交易所需的最少初始资金 money,确保你在任意顺序下都能完成所有交易。

示例

示例 1
输入:

transactions = [[2,1], [5,0], [4,2]]

输出:

10

解释:
若初始资金为 10,那么无论以何种顺序执行交易,都能成功完成所有交易。

示例 2
输入:

transactions = [[3,0], [0,3]]

输出:

3

解释:
若初始资金为 3,无论以何种顺序执行交易,都能完成所有交易。具体地,执行顺序为 [[3,0], [0,3]] 时,资金为 3,完成所有交易。

提示

  • 1 <= transactions.length <= 10^5
  • transactions[i].length == 2
  • 0 <= costi, cashbacki <= 10^9

思路分析

分析问题

本题的关键在于找出一个足够的初始资金 money,使得无论交易顺序如何,都能够完成所有交易。我们可以将问题分为两部分来分析:

  1. 资金不足部分:对于每笔交易,money 需要保证至少能支付 costi。因此,在每笔交易中,若 costi > cashbacki,则至少需要支付 costi - cashbacki 的差额,这部分差额累计起来即为必须的最小资金。

  2. 最小起始资金:对于每一笔交易,它可能会有一部分“返还资金”(即 cashbacki)。对于完成某些交易,cashbacki 可以帮助你减轻初始资金的压力。我们需要找出一个最合适的初始资金,使得所有交易都能顺利进行。

解题思路

  1. 首先计算每笔交易的资金缺口:对于每笔交易 i = [costi, cashbacki],我们需要额外的资金 max(0, costi - cashbacki) 才能顺利完成该交易。

  2. 找到最大需要的初始资金:通过找出所有交易中的最小金额 min(costi, cashbacki),这个值表示为了完成所有交易,你在最初时刻可能需要的最大额外资金。

  3. 返回结果:最终的初始资金应该是上面两者的总和。

具体实现

from typing import Listclass Solution:def minimumMoney(self, transactions: List[List[int]]) -> int:# total 为所有交易的资金缺口total = 0# mx 为所有交易中最小的 costi 和 cashbacki 的差额mx = 0# 遍历每一笔交易for cost, cashback in transactions:# 累加每笔交易的资金缺口total += max(0, cost - cashback)# 找到最大需要的起始资金mx = max(mx, min(cost, cashback))# 最终的初始资金 = 所有交易的资金缺口 + 最大需要的起始资金return total + mx

代码解析

  • total:累加所有交易中必须先支付的资金缺口(即 max(0, cost - cashback))。这表示即使你按照最优顺序进行交易,至少也需要这么多资金才能顺利完成所有交易。

  • mx:计算所有交易中的最大 min(costi, cashbacki),这代表了为了保证所有交易顺利完成,在最开始时可能需要的额外资金。

最终返回的结果是 total + mx,即所有交易的资金缺口和最大额外资金的和。


复杂度分析

  • 时间复杂度
    遍历一次 transactions 数组,每次操作常数时间,因此时间复杂度是 O(n),其中 ntransactions 的长度。

  • 空间复杂度
    使用了常数空间来存储一些变量,因此空间复杂度是 O(1)。


总结

通过这个问题,我们可以学习到如何通过分解交易中的不同部分来分析最小初始资金。理解了如何计算资金缺口和最小需要的额外资金后,可以高效地得出最少初始资金。这个方法适用于交易顺序不确定的情况下,保证无论如何都能顺利完成所有交易。


http://www.ppmy.cn/ops/155299.html

相关文章

React 前端框架开发详细操作

一、引言 在当今的 web 开发领域,React 作为一款流行的前端框架,以其高效的组件化开发模式、虚拟 DOM 带来的高性能以及灵活的生态系统,受到了广大开发者的青睐。无论是开发小型的单页应用还是大型的企业级项目,React 都能展现出强大的能力。本文将详细介绍 React 前端框架…

CSS 中调整元素大小的全面指南

CSS 中调整元素大小的全面指南 1. 原始尺寸&#xff08;固有尺寸&#xff09;示例代码&#xff1a;图像的固有尺寸 2. 设置具体的尺寸示例代码&#xff1a;设置固定宽度和高度 3. 使用百分比示例代码&#xff1a;使用百分比设置宽度 4. 使用百分比作为外边距和内边距示例代码&a…

AI技术路线(marked)

人工智能&#xff08;AI&#xff09;是一个非常广泛且充满潜力的领域&#xff0c;它涉及了让计算机能够执行通常需要人类智能的任务&#xff0c;比如感知、推理、学习、决策等。人工智能的应用已经渗透到各行各业&#xff0c;从自动驾驶到医疗诊断&#xff0c;再到推荐系统和自…

第38周:猫狗识别 (Tensorflow实战第八周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 六、模型评估 七、预测 总结 前言…

VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)

使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办&#xff1f; 很好解决&#xff0c;大概率的原因是因为latex没有添加到系统环境变量中&#xff0c;所有设置的编译工具没有办法找到才出现的这种情况。 解决方法&#xff1a; winR 然后输…

Qpython+Flask监控添加发送语音中文信息功能

对QpythonFlask实现对小孩学习的监控-CSDN博客中html页面进行改造&#xff0c;利用Ajax&#xff0c;提交一段文字&#xff0c;发送到数据库&#xff0c;再在服务器&#xff0c;发送该段文件给手机端&#xff0c;然手机端TTS朗读出来&#xff0c;增加了父母监控小孩学习&#xf…

搜索引擎友好:设计快速收录的网站架构

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/14.html 为了设计一个搜索引擎友好的网站架构&#xff0c;以实现快速收录&#xff0c;可以从以下几个方面入手&#xff1a; 一、清晰的目录结构与层级 合理划分内容&#xff1a;目录结构应…

Hive安装教程

Hive安装教程 文章目录 Hive安装教程写在前面安装下载安装部署安装Hive启动并使用Hive MySQL安装检查当前系统是否安装过MySQL安装初始化数据库 Hive元数据配置到MySQL拷贝驱动配置Metastore到MySQL再次启动Hive 写在前面 Linux版本&#xff1a;CentOS7.5Hive版本&#xff1a;…