Skip to content

Commit d6ab8ec

Browse files
authored
Create minimum-swaps-to-sort-by-digit-sum.cpp
1 parent 6f49853 commit d6ab8ec

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Time: O(nlogr)
2+
// Space: O(n)
3+
4+
// sort
5+
class Solution {
6+
public:
7+
int minSwaps(vector<int>& nums) {
8+
const auto& total = [](int x) {
9+
int result = 0;
10+
for (; x; x /= 10) {
11+
result += x % 10;
12+
}
13+
return result;
14+
};
15+
16+
vector<int> idxs(size(nums));
17+
iota(begin(idxs), end(idxs), 0);
18+
sort(begin(idxs), end(idxs), [&](const auto& i, const auto& j) {
19+
return pair(total(nums[i]), nums[i]) < pair(total(nums[j]), nums[j]);
20+
});
21+
vector<int> i_to_idx(size(idxs), -1);
22+
for (int i = 0; i < size(idxs); ++i) {
23+
i_to_idx[idxs[i]] = i;
24+
}
25+
int result = 0;
26+
vector<bool> lookup(size(nums));
27+
for (int i = 0; i < size(nums); ++i) {
28+
int l = 0;
29+
while (!lookup[i]) {
30+
lookup[i] = true;
31+
++l;
32+
i = i_to_idx[i];
33+
}
34+
result += max(l - 1, 0);
35+
}
36+
return result;
37+
}
38+
};

0 commit comments

Comments
 (0)