Skip to content

Commit c4e4298

Browse files
authored
Update optimal-account-balancing.cpp
1 parent 7980b27 commit c4e4298

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

C++/optimal-account-balancing.cpp

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,41 @@
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)
33

44
class Solution {
55
public:
66
int minTransfers(vector<vector<int>>& transactions) {
77
unordered_map<int, int> account;
8-
for (const auto& transaction : transactions) {
8+
for (const auto& transaction
9+
: transactions) {
910
account[transaction[0]] += transaction[2];
1011
account[transaction[1]] -= transaction[2];
1112
}
1213

13-
vector<int> debt;
14-
for (const auto& kvp : account) {
14+
vector<int> debts;
15+
for (const auto& kvp: account) {
1516
if (kvp.second) {
16-
debt.emplace_back(kvp.second);
17+
debts.emplace_back(kvp.second);
1718
}
1819
}
19-
if (debt.empty()) {
20+
if (debts.empty()) {
2021
return 0;
2122
}
2223

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]);
4135
}
4236
}
43-
subset.emplace_back(i);
4437
}
4538
}
46-
return dp.back();
39+
return debts.size() - dp.back();
4740
}
4841
};

0 commit comments

Comments
 (0)