1
+ // Runtime: 209 ms (Top 84.06%) | Memory: 75.6 MB (Top 97.21%)
1
2
class Solution {
2
3
int[] parent;
3
4
public int[][] matrixRankTransform(int[][] matrix) {
4
5
int m = matrix.length;
5
6
int n = matrix[0].length;
6
7
int[][] answer = new int[m][n];
7
-
8
+
8
9
// GROUP BY MATRIX VAL -> {X,Y}
9
10
TreeMap<Integer, List<int[]>> map = new TreeMap<>();
10
11
for(int i = 0; i < m; i++){
@@ -16,97 +17,93 @@ public int[][] matrixRankTransform(int[][] matrix) {
16
17
map.get(val).add(xy);
17
18
}
18
19
}
19
-
20
-
20
+
21
21
// INITIALIZE MIN-RANK ARRAY FOR EVERY COL/ROW
22
22
int[] minX = new int[m];
23
23
int[] minY = new int[n];
24
-
24
+
25
25
for(Integer key : map.keySet()){
26
26
List<int[]> list = map.get(key);
27
-
27
+
28
28
// SPLIT TO GROUPS USING UNION FIND FOR VALs IN SAME COL/ROW
29
29
int lSize = list.size();
30
30
parent = new int[lSize];
31
31
for(int i = 0; i < lSize; i++)
32
32
parent[i] = i;
33
-
33
+
34
34
// Group the xy by col and row then union by row & by col
35
35
HashMap<Integer, List<Integer>> xMap = new HashMap<>();
36
36
HashMap<Integer, List<Integer>> yMap = new HashMap<>();
37
37
for(int i = 0; i < lSize; i++){
38
38
int[] xy = list.get(i);
39
39
int x = xy[0];
40
40
int y = xy[1];
41
-
41
+
42
42
if(xMap.get(x) == null)
43
43
xMap.put(x, new ArrayList<>());
44
44
if(yMap.get(y) == null)
45
45
yMap.put(y, new ArrayList<>());
46
46
xMap.get(x).add(i);
47
47
yMap.get(y).add(i);
48
48
}
49
-
49
+
50
50
// union by X
51
51
for(Integer xKey : xMap.keySet()){
52
52
List<Integer> xList = xMap.get(xKey);
53
53
for(int i = 1; i < xList.size(); i++){
54
54
union(xList.get(i-1), xList.get(i));
55
55
}
56
56
}
57
-
58
-
57
+
59
58
// union by Y
60
59
for(Integer yKey : yMap.keySet()){
61
60
List<Integer> yList = yMap.get(yKey);
62
61
for(int i = 1; i < yList.size(); i++){
63
62
union(yList.get(i-1), yList.get(i));
64
63
}
65
64
}
66
-
65
+
67
66
HashMap<Integer, List<int[]>> group = new HashMap<>();
68
67
for(int i = 0; i < lSize; i++){
69
68
int grp = find(i);
70
69
if(group.get(grp) == null)
71
70
group.put(grp, new ArrayList<>());
72
71
group.get(grp).add(list.get(i));
73
72
}
74
-
75
-
73
+
76
74
// SET ANSWER FOR EACH GROUP
77
75
for(Integer grpKey : group.keySet()){
78
76
int max = 1;
79
77
List<int[]> sublist = group.get(grpKey);
80
-
78
+
81
79
// FIND MAX-RANK FOR THIS GROUP
82
80
for(int[] xy : sublist){
83
81
int x = xy[0];
84
82
int y = xy[1];
85
-
83
+
86
84
max = Math.max(max, Math.max(minX[x], minY[y]));
87
85
}
88
-
86
+
89
87
// UPDATE ANSWER = MAX-RANK AND SET NEW MIN-RANK FOR ROW/COL = MAX-RANK+1
90
88
for(int[] xy : sublist){
91
89
int x = xy[0];
92
90
int y = xy[1];
93
91
answer[x][y] = max;
94
92
minX[x] = max+1;
95
93
minY[y] = max+1;
96
- }
94
+ }
97
95
}
98
96
}
99
97
return answer;
100
98
}
101
-
102
-
99
+
103
100
// UNION FIND IMPL
104
101
void union(int a, int b){
105
102
int pa = find(a);
106
103
int pb = find(b);
107
104
parent[pb] = pa;
108
105
}
109
-
106
+
110
107
int find(int a){
111
108
int pa = parent[a];
112
109
if(pa != a){
@@ -115,4 +112,4 @@ int find(int a){
115
112
} else
116
113
return a;
117
114
}
118
- }
115
+ }
0 commit comments