|
1 |
| -// Time: O(n * 2^n), n is the size of the debt. |
2 |
| -// Space: O(n * 2^n) |
| 1 | +// Time: O(n * 2^n), n is the size of debts. |
| 2 | +// Space: O(2^n) |
3 | 3 |
|
4 | 4 | class Solution {
|
5 | 5 | public:
|
6 | 6 | int minTransfers(vector<vector<int>>& transactions) {
|
7 | 7 | unordered_map<int, int> account;
|
8 |
| - for (const auto& transaction : transactions) { |
| 8 | + for (const auto& transaction |
| 9 | + : transactions) { |
9 | 10 | account[transaction[0]] += transaction[2];
|
10 | 11 | account[transaction[1]] -= transaction[2];
|
11 | 12 | }
|
12 | 13 |
|
13 |
| - vector<int> debt; |
14 |
| - for (const auto& kvp : account) { |
| 14 | + vector<int> debts; |
| 15 | + for (const auto& kvp: account) { |
15 | 16 | if (kvp.second) {
|
16 |
| - debt.emplace_back(kvp.second); |
| 17 | + debts.emplace_back(kvp.second); |
17 | 18 | }
|
18 | 19 | }
|
19 |
| - if (debt.empty()) { |
| 20 | + if (debts.empty()) { |
20 | 21 | return 0;
|
21 | 22 | }
|
22 | 23 |
|
23 |
| - const auto n = 1 << debt.size(); |
24 |
| - vector<int> dp(n, numeric_limits<int>::max()), subset; |
25 |
| - for (int i = 1; i < n; ++i) { |
26 |
| - int net_debt = 0, number = 0; |
27 |
| - for (int j = 0; j < debt.size(); ++j) { |
28 |
| - if (i & 1 << j) { |
29 |
| - net_debt += debt[j]; |
30 |
| - ++number; |
31 |
| - } |
32 |
| - } |
33 |
| - if (net_debt == 0) { |
34 |
| - dp[i] = number - 1; |
35 |
| - for (const auto& s : subset) { |
36 |
| - if ((i & s) == s) { |
37 |
| - if (dp[s] != numeric_limits<int>::max() && |
38 |
| - dp[i - s] != numeric_limits<int>::max()) { |
39 |
| - dp[i] = min(dp[i], dp[s] + dp[i - s]); |
40 |
| - } |
| 24 | + vector<int> dp(1 << debts.size()); |
| 25 | + vector<int> sums(1 << debts.size()); |
| 26 | + for (int i = 0; i < dp.size(); ++i) { |
| 27 | + for (int j = 0; j < debts.size(); ++j) { |
| 28 | + if ((i & (1 << j)) == 0) { |
| 29 | + auto nxt = i | (1 << j); |
| 30 | + sums[nxt] = sums[i] + debts[j]; |
| 31 | + if (sums[nxt] == 0) { |
| 32 | + dp[nxt] = max(dp[nxt], dp[i] + 1); |
| 33 | + } else { |
| 34 | + dp[nxt] = max(dp[nxt], dp[i]); |
41 | 35 | }
|
42 | 36 | }
|
43 |
| - subset.emplace_back(i); |
44 | 37 | }
|
45 | 38 | }
|
46 |
| - return dp.back(); |
| 39 | + return debts.size() - dp.back(); |
47 | 40 | }
|
48 | 41 | };
|
0 commit comments