GuilinDev

Lc0465

05 August 2008

465. Optimal Account Balancing

给一个交易数组,其中transactions[i] = [from_i, to_i, amount_i] 表示ID = from_i 的人给了ID = to_i 的人amount_i $。

返回清偿债务所需的最少交易次数。

DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
    /*
    leetcode.com/problems/optimal-account-balancing/discuss/95355/11-liner-9ms-DFS-solution-(detailed-explanation)/99762
    */
    public int minTransfers(int[][] transactions) {
        Map<Integer, Long> map = new HashMap();
        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> list = new ArrayList();
        for (long val : map.values()) {
            if (val != 0) list.add(val);
        }

        Long[] debts = new Long[list.size()];
        debts = list.toArray(debts);
        return dfs(debts, 0, 0);
    }

    private int dfs(Long[] debts, int pos, int count) {
        while (pos < debts.length && debts[pos] == 0) {
            pos++;
        }
        if (pos >= debts.length) {
            return count;
        }
        int result = Integer.MAX_VALUE;
        for (int i = pos + 1; i < debts.length; i++) {
            if (debts[pos] * debts[i] < 0) {
                debts[i] += debts[pos];
                result = Math.min(result, dfs(debts, pos + 1, count + 1));
                debts[i] = debts[i] - debts[pos];
            }
        }
        return result;
    }
}