|
| 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