class Solution {
public int minTransfers(int[][] transactions) {
Map<Integer, Long> map = new HashMap();
// build id -> debt
for(int[] t: transactions){
long val1 = map.getOrDefault(t[0], 0L);
long val2 = map.getOrDefault(t[1], 0L);
map.put(t[0], val1 - t[2]);
map.put(t[1], val2 + t[2]);
}
// ignore those who dont has debt
List<Long> list = new ArrayList();
for(long val: map.values()) {
if(val != 0) list.add(val);
}
// list -> array, just for faster calc & convenient
Long[] debts = new Long[list.size()];
debts = list.toArray(debts);
// to counteract 抵消
return helper(debts, 0 , 0);
}
// dfs(backtracking)
int helper(Long[] debts, int pos, int count) {
while(pos < debts.length && debts[pos] == 0) pos++;
int res = Integer.MAX_VALUE;
long pre = 0;
for(int i = pos + 1; i < debts.length; i++) {
// look for other debts with opposite sign to debt[pos]
// pre: avoid same debt
if(debts[i] != pre && debts[i] * debts[pos] < 0) {
debts[i] += debts[pos];
res = Math.min(res, helper(debts, pos + 1, count + 1)); // enter recursive: debts[pos] has been taken care of
debts[i] = debts[i] - debts[pos]; // backtrack
pre = debts[i];
}
}
return res == Integer.MAX_VALUE ? count : res;
}
}
class Solution {
public int minTransfers(int[][] transactions) {
Map<Integer, Long> map = new HashMap<>();
//build id ->debt
for(int[] t: transactions){
long val1 = map.getOrDefault(t[0], 0L);
long val2 = map.getOrDefault(t[1], 0L);
map.put(t[0], val1-t[2]);
map.put(t[1], val2+t[2]);
}
List<Long> debts = new ArrayList<>();
for(Long val: map.values()){
if(val!=0){
debts.add(val);
}
}
return helper(debts,0,0);
}
int helper(List<Long> debts, int pos, int count){
if(pos>debts.size()){
return count;
}
int res = Integer.MAX_VALUE;
while(pos<debts.size()&&debts.get(pos) == 0){
pos++;
}
for(int i = pos+1; i<debts.size(); i++){
if(debts.get(i)*debts.get(pos)<0){
Long m = debts.get(i)+debts.get(pos) ;
debts.set(i, m);
res = Math.min(res, helper(debts, pos+1, count+1));
Long n = debts.get(i) - debts.get(pos);
debts.set(i, n);
}
}
return res == Integer.MAX_VALUE? count : res;
}
}