@@ -88,3 +88,68 @@ function shakeRow(matrix, rowIndex, result) {
88
88
}
89
89
return changed
90
90
}
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