optimal-account-balancing
2024-10-10 03:02:00
一群朋友去度假,有时互相借钱。
例如,爱丽丝为比尔的午餐支付了 10 美元。后来克里斯给爱丽丝 5 美元搭出租车。我们可以假设每笔交易为一个三元组(X,Y,Z),这意味着第 X 个人借给第 Y 个人 Z 美元。假设 Alice,Bill 和 Chris 是第0,1,2 个人(0,1,2是他们的ID),他们之间的交易可以表示为[ [ 0,1,10 ],[ 2,0,5 ] ]。
给定一组人之间的交易清单,返回结算所需的最低交易数量。
九章算法一篇置顶题目 挺有意思 第一次看到这种需要指数级复杂度的面试题
下面的解法非常具有局限性 如果 debt非零的人多于32 或 64 下面的方法是行不通的
public class Solution { public int minTransfer(int[][] transactions){
Map<Integer, Integer> debts = new HashMap<Integer, Integer>();
for(int[] t: transactions){
debts.put(t[0], getOrDefault(t[0], 0)-t[2]);
debts.put(t[1], getOrDefault(t[1], 0)+t[2]);
}
int len = 0;
int[] account = new int[debts.size()];
for(int total: debts.values()){
if(total!=0){
account[len++] = total;
}
}
if(len ==0) return 0;
int dp = new int[1<<len];
Arrays.fill(dp, Integer.MAX_VALUE);
for(int l =1; l <dp.length; l++){
int sum =0;
int count =0;
for(int i=0; i<len;i++){
if((1<<i&l)!=0){
sum + = account[i];
count ++;
}
}
if(sum ==0){
dp[l] = count-1;
for(int i =1; i<l;i++){
if((i&l)==i &&(dp[i]+dp[l-i])< dp[l]){
dp[l] = dp[i]+dp[l-i];
}
}
}
}
return dp[len-1];
} }
最新文章
- T-SQL字符串相加之后被截断的那点事
- Oracle中的rownum和rowid
- Vue 双层嵌套
- oracle字符集问题总结
- FKCL-OS&mdash;&mdash;自主的操作系统
- Java RMI之介绍
- MySQL忘记密码 办法
- (转载)Eclipse基金会涉足物联网,M2M标准是否已获东风?
- Scala刮:使用Intellij IDEA写hello world
- 3.Lucene3.x API分析,Director 索引操作目录,Document,分词器
- Filebeat命令参考
- Jmeter 非 GUI 命令行执行脚本文件
- spring静态注入
- 019_删除链表的倒数第N个节点
- ZOJ 4067 - Books - [贪心][2018 ACM-ICPC Asia Qingdao Regional Problem J]
- nrf24l01 IRQ一直为高电平
- <;基础>; PHP 进阶之 流程控制(Process)
- Beta冲刺——day7
- 图解USB协议之一 枚举过程【转】
- Python初学者的捷径[译]