一群朋友去度假,有时互相借钱。

例如,爱丽丝为比尔的午餐支付了 10 美元。后来克里斯给爱丽丝 5 美元搭出租车。我们可以假设每笔交易为一个三元组(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];
} }

最新文章

  1. T-SQL字符串相加之后被截断的那点事
  2. Oracle中的rownum和rowid
  3. Vue 双层嵌套
  4. oracle字符集问题总结
  5. FKCL-OS&mdash;&mdash;自主的操作系统
  6. Java RMI之介绍
  7. MySQL忘记密码 办法
  8. (转载)Eclipse基金会涉足物联网,M2M标准是否已获东风?
  9. Scala刮:使用Intellij IDEA写hello world
  10. 3.Lucene3.x API分析,Director 索引操作目录,Document,分词器
  11. Filebeat命令参考
  12. Jmeter 非 GUI 命令行执行脚本文件
  13. spring静态注入
  14. 019_删除链表的倒数第N个节点
  15. ZOJ 4067 - Books - [贪心][2018 ACM-ICPC Asia Qingdao Regional Problem J]
  16. nrf24l01 IRQ一直为高电平
  17. &lt;基础&gt; PHP 进阶之 流程控制(Process)
  18. Beta冲刺——day7
  19. 图解USB协议之一 枚举过程【转】
  20. Python初学者的捷径[译]

热门文章

  1. Linux常用命令——网络命令
  2. 关于查询ios的app更新的历史版本记录
  3. Oracle update语句更新值来自另一张表中的数据
  4. div变成输入框
  5. day6_自定义类型转换
  6. vitual dom实现(转)
  7. Java多线程之volatile关键字《一》
  8. Phpstorm-远程连接服务器实时编辑代码
  9. introduce explaining variable 引入解释变量
  10. leetcode刷题——一些算法技巧总结2.0