1# Runtime: 3042 ms (Top 71.65%) | Memory: 50.4 MB (Top 92.27%)2class Solution:3def matrixRankTransform(self, matrix: List[List[int]]) -> List[List[int]]:4m, n = len(matrix), len(matrix[0])5rank = [0] * (m + n)6d = defaultdict(list)7for i in range(m):8for j in range(n):9d[matrix[i][j]].append((i, j))1011def find(i):12if p[i] != i:13p[i] = find(p[i])14return p[i]1516def union(i, j):17pi, pj = find(i), find(j)18p[pi] = pj19newrank[pj] = max(newrank[pi], newrank[pj])2021for e in sorted(d):22p = list(range(m + n))23newrank = rank[:]24for i, j in d[e]:25union(i, m + j)26for i, j in d[e]:27rank[i] = rank[m + j] = matrix[i][j] = newrank[find(i)] + 128return matrix