Skip to content

Commit 3272ad9

Browse files
authored
Update 1632-rank-transform-of-a-matrix.js
1 parent be4bef5 commit 3272ad9

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

1632-rank-transform-of-a-matrix.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,68 @@ function shakeRow(matrix, rowIndex, result) {
8888
}
8989
return changed
9090
}
91+
92+
// another
93+
94+
/**
95+
* @param {number[][]} matrix
96+
* @return {number[][]}
97+
*/
98+
const matrixRankTransform = function (matrix) {
99+
const r = matrix.length,
100+
c = matrix[0].length;
101+
const t = r * c;
102+
const arr = Array(t);
103+
const root = Array(t + 1);
104+
const rk = Array(t + 1).fill(0);
105+
const find = (a) => {
106+
let ra = root[a];
107+
if (ra == a) return a;
108+
return (root[a] = find(ra));
109+
};
110+
const union = (a, b) => {
111+
let ra = find(a);
112+
let rb = find(b);
113+
if (ra !== rb) {
114+
if (rk[ra] > rk[rb]) root[rb] = ra;
115+
else root[ra] = rb;
116+
}
117+
};
118+
let k = 0;
119+
const ans = Array(r)
120+
.fill(0)
121+
.map(() => Array(c));
122+
for (let i = 0; i < r; ++i) {
123+
for (let j = 0; j < c; ++j) {
124+
arr[k] = [matrix[i][j], i, j];
125+
root[k] = k;
126+
++k;
127+
}
128+
}
129+
root[k] = k;
130+
arr.sort((a, b) => a[0] - b[0]);
131+
const X = Array(r)
132+
.fill(0)
133+
.map(() => [-Infinity, t]);
134+
const Y = Array(c)
135+
.fill(0)
136+
.map(() => [-Infinity, t]);
137+
for (let i = 0; i < t; ++i) {
138+
const [v, x, y] = arr[i];
139+
const id = x * c + y;
140+
const [xv, rx] = X[x],
141+
[yv, ry] = Y[y];
142+
if (v > xv) rk[id] = rk[find(rx)] + 1;
143+
else root[id] = rx;
144+
if (v > yv) rk[find(id)] = Math.max(rk[find(id)], rk[find(ry)] + 1);
145+
else union(id, ry);
146+
X[x] = [v, id];
147+
Y[y] = [v, id];
148+
}
149+
for (let i = 0; i < r; ++i) {
150+
for (let j = 0; j < c; ++j) {
151+
ans[i][j] = rk[find(i * c + j)];
152+
}
153+
}
154+
return ans;
155+
};

0 commit comments

Comments
 (0)