classSolution: defmaxIncreasingCells(self, mat: List[List[int]]) -> int: g = defaultdict(list) for i, row inenumerate(mat): for j, x inenumerate(row): g[x].append((i, j)) # 相同元素放在同一组,统计位置
row_max = [0] * len(mat) col_max = [0] * len(mat[0]) for _, pos insorted(g.items(), key=lambda p: p[0]): # 先把最大值算出来,再更新 row_max 和 col_max mx = [max(row_max[i], col_max[j]) + 1for i, j in pos] for (i, j), f inzip(pos, mx): row_max[i] = max(row_max[i], f) # 更新第 i 行的最大 f 值 col_max[j] = max(col_max[j], f) # 更新第 j 列的最大 f 值 returnmax(row_max)
classSolution { public: intmaxIncreasingCells(vector<vector<int>> &mat){ map<int, vector<pair<int, int>>> g; int m = mat.size(), n = mat[0].size(); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) g[mat[i][j]].emplace_back(i, j); // 相同元素放在同一组,统计位置
vector<int> row_max(m), col_max(n); for (auto &[_, pos]: g) { vector<int> mx; // 先把最大值算出来,再更新 row_max 和 col_max for (auto &[i, j]: pos) mx.push_back(max(row_max[i], col_max[j]) + 1); for (int k = 0; k < pos.size(); k++) { auto &[i, j] = pos[k]; row_max[i] = max(row_max[i], mx[k]); // 更新第 i 行的最大 f 值 col_max[j] = max(col_max[j], mx[k]); // 更新第 j 列的最大 f 值 } } return *max_element(row_max.begin(), row_max.end()); } };
funcmaxIncreasingCells(mat [][]int) (ans int) { type pair struct{ x, y int } g := map[int][]pair{} for i, row := range mat { for j, x := range row { g[x] = append(g[x], pair{i, j}) // 相同元素放在同一组,统计位置 } } a := make([]int, 0, len(g)) for k := range g { a = append(a, k) } sort.Ints(a) // 从小到大
rowMax := make([]int, len(mat)) colMax := make([]int, len(mat[0])) for _, x := range a { pos := g[x] mx := make([]int, len(pos)) for i, p := range pos { mx[i] = max(rowMax[p.x], colMax[p.y]) + 1// 先把最大值算出来,再更新 rowMax 和 colMax ans = max(ans, mx[i]) } for i, p := range pos { rowMax[p.x] = max(rowMax[p.x], mx[i]) // 更新第 p.x 行的最大 f 值 colMax[p.y] = max(colMax[p.y], mx[i]) // 更新第 p.y 列的最大 f 值 } } return }
funcmax(a, b int)int { if b > a { return b }; return a }
复杂度分析
时间复杂度:\mathcal{O}(mn\log (mn)),其中 m 和 n 分别为 mat 的行数和列数。瓶颈在排序上。