Skip to content

Commit e69dcb5

Browse files
authored
Create 2948-make-lexicographically-smallest-array-by-swapping-elements.js
1 parent b0a42a8 commit e69dcb5

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//////////////////////////// Template /////////////////////////////////
2+
function DJSet(n) {
3+
let parent = Array(n).fill(-1);
4+
return { find, union, count, equiv, par, grp }
5+
function find(x) {
6+
return parent[x] < 0 ? x : parent[x] = find(parent[x]);
7+
}
8+
function union(x, y) {
9+
x = find(x);
10+
y = find(y);
11+
if (x == y) return false;
12+
if (parent[x] < parent[y]) [x, y] = [y, x];
13+
parent[x] += parent[y];
14+
parent[y] = x;
15+
return true;
16+
}
17+
function count() { // total groups
18+
return parent.filter(v => v < 0).length;
19+
}
20+
function equiv(x, y) { // isConnected
21+
return find(x) == find(y);
22+
}
23+
function par() {
24+
return parent;
25+
}
26+
function grp() {
27+
let groups = [];
28+
for (let i = 0; i < n; i++) groups.push([]);
29+
for (let i = 0; i < n; i++) groups[find(i)].push(i); // sorted and unique
30+
return groups;
31+
}
32+
}
33+
////////////////////////////////////////////////////////////////
34+
/**
35+
* @param {number[]} nums
36+
* @param {number} limit
37+
* @return {number[]}
38+
*/
39+
var lexicographicallySmallestArray = function(nums, limit) {
40+
let d = nums.map((x, i) => [x, i]).sort((x, y) => x[0] - y[0] || x[1] - y[1]), pairs = [];
41+
for (let i = 1; i < nums.length; i++) {
42+
if (d[i][0] - d[i - 1][0] <= limit) pairs.push([d[i - 1][1], d[i][1]]);
43+
}
44+
return LexicalSmallestArrayWithSwaps(nums, pairs)
45+
};
46+
47+
48+
// reference: https://leetcode.com/problems/smallest-string-with-swaps/
49+
function LexicalSmallestArrayWithSwaps (a, pairs) {
50+
let n = a.length, ds = new DJSet(n), res = Array(n).fill(0);
51+
for (const [x, y] of pairs) ds.union(x, y);
52+
let groups = ds.grp().filter(e => e.length);
53+
for (const group of groups) {
54+
let ga = [];
55+
for (let i of group) ga.push(a[i]);
56+
ga.sort((x, y) => x - y);
57+
for (let i = 0; i < group.length; i++) res[group[i]] = ga[i];
58+
}
59+
return res;
60+
};
61+

0 commit comments

Comments
 (0)