技术标签: 算法 面试 编程语言 leetcode 动态规划
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 最优账单平衡,我们先来看题面:
https://leetcode-cn.com/problems/optimal-account-balancing/
A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for Bill’s lunch for $10. Then later Chris gave Alice $5 for a taxi ride. We can model each transaction as a tuple (x, y, z) which means person x gave person y $z. Assuming Alice, Bill, and Chris are person 0, 1, and 2 respectively (0, 1, 2 are the person’s ID), the transactions can be represented as [[0, 1, 10], [2, 0, 5]].
Given a list of transactions between a group of people, return the minimum number of transactions required to settle the debt.
Note:
A transaction will be given as a tuple (x, y, z). Note that x ≠ y and z > 0.
Person’s IDs may not be linear, e.g. we could have the persons 0, 1, 2 or we could also have the persons 0, 2, 6.
一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x, y, z) 表示一次交易,表示 x 借给 y 共计 z 美元。用 0, 1, 2 表示小爱同学、小新同学和小明同学(0, 1, 2 为人的标号),上述交易可以表示为 [[0, 1, 10], [2, 0, 5]]。
给定一群人之间的交易信息列表,计算能够还清所有债务的最小次数。
注意:
一次交易会以三元组 (x, y, z) 表示,并有 x ≠ y 且 z > 0。
人的标号可能不是按顺序的,例如标号可能为 0, 1, 2 也可能为 0, 2, 6。
示例 1:
输入:
[[0,1,10], [2,0,5]]
输出:
2
解释:
人 #0 给人 #1 共计 10 美元。
人 #2 给人 #0 共计 5 美元。
需要两次交易。一种方式是人 #1 分别给人 #0 和人 #2 各 5 美元。
示例 2:
输入:
[[0,1,10], [1,0,1], [1,2,5], [2,0,5]]
输出:
1
解释:
人 #0 给人 #1 共计 10 美元。Person #0 gave person #1 $10.
人 #1 给人 #0 共计 1 美元。Person #1 gave person #0 $1.
人 #1 给人 #2 共计 5 美元。Person #1 gave person #2 $5.
人 #2 给人 #0 共计 5 美元。Person #2 gave person #0 $5.
因此,人 #1 需要给人 #0 共计 4 美元,所有的债务即可还清。
https://zhuanlan.zhihu.com/p/127316386
解题思路:
把整个借还钱过程,看成一个系统,你从上帝视角看这些过程。
一个人如果借出去和还出去钱相等,说明可以退出这个系统,比如你借小明2元,小红欠你2元,虽然是两个过程,但是你在这个系统,没有导致自己的收入变多或者变少,上帝会帮你平衡这一切,你的退出不好影响系统。所以,我们可以计算出每个账号上有多少钱,正负表示自己拥有的财产。
本身就是NP难问题,暴力回溯解决问题
直接看代码,很容易理解的!
class Solution:
def minTransfers(self, transactions: List[List[int]]) -> int:
from collections import defaultdict
person = defaultdict(int)
for x, y, z in transactions:
person[x] -= z
person[y] += z
# 账号
accounts = list(person.values())
res = float("inf")
def dfs(i, cnt):
nonlocal res
# 全局变量退出递归
if cnt >= res: return
# 账号为0不考虑
while i < len(accounts) and accounts[i] == 0: i += 1
# 遍历完
if i == len(accounts):
res = min(res, cnt)
return
for j in range(i + 1, len(accounts)):
if accounts[i] * accounts[j] < 0:
accounts[j] += accounts[i]
dfs(i + 1, cnt + 1)
accounts[j] -= accounts[i]
dfs(0, 0)
return res
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。
上期推文:
LeetCode刷题实战462:最少移动次数使数组元素相等 II
语音识别开发实战案例教程 数据产品讲师,人工智能探索者,15年一线IT研发经...
牛客刷题day11文章目录牛客刷题day111.在两个长度相等的数组中寻找中位数题目解题思路核心代码2.删除链表中重复的元素题目解题思路核心代码3.矩阵元素查找题目解题思路核心代码4.链表的奇偶重排题目解题思路核心代码5.重排链表题目解题思路核心代码6.反转数字题目解题思路核心代码1.在两个长度相等的数组中寻找中位数题目给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2
在有些SAP测试系统中,ABAP标准课程程序涉及到的表没有数据,给ABAP程序员学习带来麻烦。其实这个问题可以通过SAP提供的标准函数BCALV_GENERATE_ALV_T_T2和BCALV_GENERATE_TEST_DATA来解决。BCALV_GENERATE_ALV_T_T2和BCALV_GENERATE_TEST_DATA是SAP编写的标准函数,用于向自动生成测试数据,自动向scarr
1、#{}:标识一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换,程序员不需要考虑参数的类型,比如传入字符串,mybatis最终拼接好的sql就是参数两边加单引号${}:标识sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。&lt;select id="findUserById" parameterType="java.util.Map"...
1. Demo初始界面2. 游戏界面3. 精确碰撞检測4. 下载 压缩文件文件夹AngryBird source 愤慨的小鸟Demo源码,基于Cocos2dx C++,以及box2d技术。run 可运行程序文件夹点击打开链接 ...
1:切换到你想要安装的目录:cd developer2:得到一个安装包,选择自己想要的版本:wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz23:解压 tar -xjvf ffmpeg-4.1.tar.bz24:切换到解压好的目录中 cd ffmpeg-4.1/5:先安装 yasm :yum install yasm6:安装完毕以后...
mfc grid控件使用MFC进行开发, 界面编程占用了很大部分的时间. 像Grid这样的控件, MFC并没有提供支持. 使用MFC进行开发,界面编程占用了很大一部分的时间。 像Grid这样的控件,MFC并没有提供支持。 发现了这样一个GridCtrl控件, 非常好用: 发现了这样一个GridCtrl控件,非常好用: http://www.codeproject.com/KB/miscctrl...
来自:https://www.cnblogs.com/qisiqiubite/p/5318736.htmlhttp://blog.163.com/dream_lxp/blog/static/50782634201051051038/应急用:两头渐变透明:&lt;hr width=80% size=3 color=#5151A2 style="FILTER: alpha(opacity=100,fi...
有什么适合大学生搜题的一些APP,比如解决高数,线代,数学建模,大学物理这样的学科问题的APP?您可以使用quark或百度直接搜索对于高级数字,您可以使用“Microsoft math”或photomath,但这需要一点高扫描角度;您也可以尝试wellframe Alpha家庭作业帮助,小猿猴搜索的题目可以在一些题目里找到微信小程序也可以试试课本上的题目可以试试“帮班宝”、“学小容易”APP有一些...
如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候,在发布这个配置文件的时候,会发生代码冲突:error: Your local changes to the following files would be overwritten by merge:protected/config/main.phpPlease, commit your changes...
1,确认安装mysql(本人用的5.1版本)2,下载mysql-connector-net-5.2.3并安装,地址:http://dev.mysql.com/downloads/connector/net/5.2.html 里面集成了MySQL Visual Studio Plugin,而mysql-connector-net-5.0不集成.3,到这步为止,已经可以用vs菜单里"工具
jsp阶段:&lt;audio controls="controls" controlsList="nodownload"&gt;&lt;source src="${ctx }/phone/getAudio.ce?type=3&amp;PATHID='+mp+'" type="audio/mpeg"&gt;&lt;/audio&gt;效果图:java部分:@Request