Leetcode 465. 最优账单平衡

article/2025/6/20 21:24:01

1.题目基本信息

1.1.题目描述

给你一个表示交易的数组 transactions ,其中 transactions[i] = [fromi, toi, amounti] 表示 ID = fromi 的人给 ID = toi 的人共计 amounti $ 。

请你计算并返回还清所有债务的最小交易笔数。

1.2.题目地址

https://leetcode.cn/problems/optimal-account-balancing/description/

2.解题方法

2.1.解题思路

子集状态压缩动态规划(子集状压dp),使用二进制整数来表示数组cnts中的子集的动态规划

2.2.解题步骤

第一步,构建各个交易的cnts数组,以及进行状态定义。

  • 1.1.构建cnts数组,cnts总共12个位置(因为交易总数最多12个),cnts[i]表示交易人的待进账(也就是借出去的总额)

  • 1.2.状态定义。dp[i]表示子集i的最小交易次数,这里使用二进制数字i中各个位上为1的状态确定cnts中的子集(也就是状态压缩),对于长度为n的数组,也刚好有2^n个子集。

第二步,状态初始化。dp[0]=0,表示空子集的转换次数为0;这在初始化时已经完成。

第三步,状态转移。如果i子集的和不为0,则不可能转换完成,那么dp[i]=inf;如果i子集的和为0,则枚举i的子集j,dp[i]=min([dp[j]+dp[i^j] for j in i的子集])(其中i^j为i中j子集的补集)(i的子集通过k=(i-1)&i,k=(k-1)&i进行枚举)

  • 3.1.计算子集i的和

  • 3.2.子集和不为0,则不可能通过有限的交易使其全部为0,此时dp[i]=inf

  • 3.3.子集和为0,则枚举i子集的子集j,进行状态转移,每次j更新都获取距离当前子集最近的i的子集(这是枚举子集的模板方法,记下来)

第四步,m-1子集即所有12个人都参与进行交换,哪些不存在的人的cnts为0。所以dp[m-1]即为题解

3.解题代码

python代码

class Solution:def minTransfers(self, transactions: List[List[int]]) -> int:# 思路:子集状态压缩动态规划(子集状压dp),使用二进制整数来表示数组cnts中的子集的动态规划# 第一步,构建各个交易的cnts数组,以及进行状态定义。# 1.1.构建cnts数组,cnts总共12个位置(因为交易总数最多12个),cnts[i]表示交易人的待进账(也就是借出去的总额)n = 12m = 1 << ncnts = [0] * nfor f, t, amount in transactions:cnts[f] += amountcnts[t] -= amount# 1.2.状态定义。dp[i]表示子集i的最小交易次数,这里使用二进制数字i中各个位上为1的状态确定cnts中的子集(也就是状态压缩),对于长度为n的数组,也刚好有2^n个子集。dp = [0] * m# 第二步,状态初始化。dp[0]=0,表示空子集的转换次数为0;这在初始化时已经完成。# 第三步,状态转移。如果i子集的和不为0,则不可能转换完成,那么dp[i]=inf;如果i子集的和为0,则枚举i的子集j,dp[i]=min([dp[j]+dp[i^j] for j in i的子集])(其中i^j为i中j子集的补集)(i的子集通过k=(i-1)&i,k=(k-1)&i进行枚举)for i in range(m):# 3.1.计算子集i的和sum_ = 0for j in range(n):if (i >> j) & 1:    # i子集的二进制第i位上是1sum_ += cnts[j]if sum_ != 0:# 3.2.子集和不为0,则不可能通过有限的交易使其全部为0,此时dp[i]=infdp[i] = infelse:# 3.3.子集和为0,则枚举i子集的子集j,进行状态转移,每次j更新都获取距离当前子集最近的i的子集(这是枚举子集的模板方法,记下来)dp[i] = bin(i).count('1') - 1j = (i - 1) & iwhile j > 0:dp[i] = min(dp[i], dp[j] + dp[i ^ j])j = (j - 1) & i# print(dp)# 第三步,m-1子集即所有12个人都参与进行交换,哪些不存在的人的cnts为0。所以dp[m-1]即为题解return dp[m - 1]

4.执行结果


http://www.hkcw.cn/article/nIdCVSXAqc.shtml

相关文章

【沉浸式求职学习day51】【发送邮件】【javaweb结尾】

沉浸式求职学习 邮件发送原理及实现1.概述2.简单邮件3.复杂邮件 网站注册发送邮件功能实现 邮件发送原理及实现 1.概述 传输协议 SMTP协议 发送邮件&#xff1a; 我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。POP3协议 接收邮件&#…

标题:2025海外短剧爆发年:APP+H5双端系统开发,解锁全球流量与变现新大陆

描述&#xff1a; 2025年出海新风口&#xff01;深度解析海外短剧系统开发核心&#xff08;APPH5双端&#xff09;&#xff0c;揭秘高效开发策略与商业化路径&#xff0c;助您抢占万亿美元市场&#xff01; 全球娱乐消费模式正在剧变。2025年&#xff0c;海外短剧市场已从蓝海…

uni-app学习笔记十六-vue3页面生命周期(三)

uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload&#xff1a;用于监听页面卸载。 当页面被关闭时&#xff0c;即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4&#xff0c;在demo4页面回退不了到d…

钉钉红包性能优化之路

一、业务背景 请客红包、小礼物作为饿了么自研的业务产品&#xff0c;在钉钉的一方化入口中常驻&#xff0c;作为高UV、PV的toB产品&#xff0c;面对不同设备环境的用户&#xff0c;经常会偶尔得到一些用户反馈&#xff0c;如【页面白屏太久了】、【卡住了】等等&#xff0c;本…

鲲鹏Arm+麒麟V10 K8s 离线部署教程

针对鲲鹏 CPU 麒麟 V10 的离线环境&#xff0c;手把手教你从环境准备到应用上线&#xff0c;所有依赖包提前打包好&#xff0c;步骤写成傻瓜式操作指南。 一、环境规划# 准备至少两台机器。 架构OS作用Arm64任意&#xff0c;Mac 也可以下载离线包Arm64麒麟 V10单机部署 K8s…

Redis主从复制详解

概述 Redis 的主从复制&#xff08;Master-Slave Replication&#xff09;是实现数据备份、读写分离和水平扩展的核心机制之一。通过主从复制&#xff0c;一个主节点&#xff08;Master&#xff09;可以将数据同步到多个从节点&#xff08;Slave&#xff09;&#xff0c;从节点…

16.进程间通信(二)

一、命名管道 1.概念 匿名管道解决了具有血缘关系的进程之间的通信&#xff0c;如果两个进程毫不相干&#xff0c;如何进行通信呢&#xff1f;通过文件&#xff0c;管道文件。 对于两个不同进程&#xff0c;打开同一路径下的同一文件&#xff0c;inode和文件内核缓冲区不会加载…

优化的两极:凸优化与非凸优化的理论、应用与挑战

在机器学习、工程设计、经济决策等众多领域&#xff0c;优化问题无处不在。而在优化理论的世界里&#xff0c;凸优化与非凸优化如同两个截然不同的 “王国”&#xff0c;各自有着独特的规则、挑战和应用场景。今天&#xff0c;就让我们深入探索这两个优化领域的核心差异、算法特…

day15 leetcode-hot100-29(链表8)

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 1.暴力法 思路 &#xff08;1&#xff09;先获取链表的长度L &#xff08;2&#xff09;然后再次遍历链表到L-n的位置&#xff0c;直接让该指针的节点指向下下一个即可。 2.哈希表 思路 &#xff0…

rtpinsertsound:语音注入攻击!全参数详细教程!Kali Linux教程!

简介 2006年8月至9月期间&#xff0c;我们创建了一个用于将音频插入指定音频&#xff08;即RTP&#xff09;流的工具。该工具名为rtpinsertsound。 该工具已在Linux Red Hat Fedora Core 4平台&#xff08;奔腾IV&#xff0c;2.5 GHz&#xff09;上进行了测试&#xff0c;但预…

谷歌Stitch:AI赋能UI设计,免费高效新利器

在AI技术日新月异的今天&#xff0c;各大科技巨头都在不断刷新我们对智能工具的认知。最近&#xff0c;谷歌在其年度I/O开发者大会期间&#xff0c;除了那些聚光灯下的重磅发布&#xff0c;还悄然上线了一款令人惊喜的AI工具——Stitch。这是一款全新的、完全免费的AI驱动UI&am…

PowerBI企业运营分析——线性回归销售预测

PowerBI企业运营分析——线性回归销售预测 欢迎来到Powerbi小课堂&#xff0c;在竞争激烈的市场环境中&#xff0c;企业运营分析平台成为提升竞争力的核心工具。 该平台通过整合多源数据&#xff0c;实现关键指标的实时监控&#xff0c;从而迅速洞察业务动态&#xff0c;精准…

<4>, Qt窗口

目录 一&#xff0c;菜单栏 二&#xff0c;工具栏 三&#xff0c;状态栏 四&#xff0c;浮动窗口 五&#xff0c;对话框 一&#xff0c;菜单栏 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 创建菜单栏…

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现

多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现 目录 多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现效果一览基本介绍…

具有离散序列建模的统一多模态大语言模型【AnyGPT】

第1章 Instruction 在人工智能领域、多模态只语言模型的发展正迎来新的篇章。传统的大型语言模型(LLM)在理解和生成人类语言方面展现出了卓越的能力&#xff0c;但这些能力通常局限于 文本处理。然而&#xff0c;现实世界是一个本质上多模态的环境&#xff0c;生物体通过视觉、…

嵌入式学习笔记 - STM32 HAL库以及标准库内核以及外设头文件区别问题

一 CMSIS内核驱动文件夹 标准库中CMSIS内核驱动文件夹中&#xff0c;仅包含两个.h文件&#xff0c;其中stm32f10x.h 为stm10系列底层文件如总线以及各片上外设模块寄存器地址&#xff0c;system_stm32f10x.h为系统底层配置文件&#xff0c;主要为时钟配置。 HAL库中CMSIS内核驱…

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表 第 一 题 - - - 移 除 链 表 元 素方 法 一 - - - 原 地 删 除方 法 二 - - - 双 指 针方 法 三 - - - 尾 插 第 二 题 - - - 反 转 链 表方 法 一 - - - 迭 代方 法 二 - - - 采 用 头 插 创 建 新 链 表 总 结 &a…

Ros真(node?package?)

Ros中 都是靠一个个节点相互配合的 如同APP之间的配合 然后节点不好单独存在&#xff0c; 我们一般把他们放在一个包里 也就是Package。 也可以自己设立一个包 如图这种 ———————————— 建立包 流程 &#xff1a; —————— 我们弄好之后 在VSCODE SRC右键 …

电路图识图基础知识-常用仪表识图及接线(九)

一、 直流电流表的使用和接线 用来测量直流电流的仪表&#xff0c;我们称为直流电流表&#xff0c;下图所示为直流电流表。 直流电流表有两种接入方式&#xff1a;直接接入法、间接接入法。下图所示为直流电流表接线方 法 。 4.1.2 交流电流表的使用和接线 交流电流表也是一种…

分享两款使用免费软件,dll修复工具及DirectX修复工具

装软件老是弹窗报错&#xff1f;两个小工具解决系统运行库问题 安装软件时弹出DLL缺失&#xff1f;别急&#xff0c;这里有办法 安装软件的时候&#xff0c;突然跳出个弹窗&#xff0c;提示缺少什么“MSVCP140.dll”或者“VCRUNTIME140.dll”&#xff0c;完全不懂。这种情况并…