class Solution {
public:
vector<vector<int>> minScore(vector<vector<int>>& grid) {
}
};
2371. 最小化网格中的最大值
给定一个包含 不同 正整数的 m × n
整数矩阵 grid
。
必须将矩阵中的每一个整数替换为正整数,且满足以下条件:
如果对于原始矩阵中的所有元素对,使 grid[r1][c1] > grid[r2][c2]
,其中要么 r1 == r2
,要么 c1 == c2
,则相对顺序保持不变。那么在替换之后一定满足 grid[r1][c1] > grid[r2][c2]
。
例如,如果 grid = [[2, 4, 5], [7, 3, 9]]
,那么一个好的替换可以是 grid = [[1, 2, 3], [2, 1, 4]]
或 grid = [[1, 2, 3], [3, 1, 4]]
。
返回 结果 矩阵。如果有多个答案,则返回其中 任何 一个。
示例 1:
输入: grid = [[3,1],[2,5]] 输出: [[2,1],[1,2]] 解释: 上面的图显示了一个有效的替换。 矩阵中的最大值是 2。可以证明,不能得到更小的值。
示例 2:
输入: grid = [[10]] 输出: [[1]] 解释: 我们将矩阵中唯一的数字替换为 1。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 1000
1 <= m * n <= 105
1 <= grid[i][j] <= 109
grid
由不同的整数组成。原站题解
java 解法, 执行用时: 96 ms, 内存消耗: 55.6 MB, 提交时间: 2023-10-20 19:38:03
class Solution { public int[][] minScore(int[][] grid) { int m = grid.length; int n = grid[0].length; int[] lines = new int[m]; int[] cols = new int[n]; List<int[]> items = new ArrayList<>(); for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ items.add(new int[]{i,j}); } } items.sort((a,b)->grid[a[0]][a[1]]-grid[b[0]][b[1]]); int[][] ans = new int[m][n]; for(int []item:items){ int x = item[0]; int y = item[1]; int v = Math.max(lines[x],cols[y])+1; ans[x][y] = v; lines[x] = v; cols[y] = v; } return ans; } }
golang 解法, 执行用时: 228 ms, 内存消耗: 13.7 MB, 提交时间: 2023-10-20 19:37:31
func max(a, b int) int { if a > b { return a } return b } func minScore(grid [][]int) [][]int { var temp [][]int m, n := len(grid), len(grid[0]) for i := 0; i < len(grid); i++ { for j := 0; j < len(grid[i]); j++ { temp = append(temp, []int{i, j}) } } sort.Slice(temp, func(i, j int) bool { return grid[temp[i][0]][temp[i][1]] < grid[temp[j][0]][temp[j][1]] }) maxCol, maxRow := make([]int, n), make([]int, m) for _, ints := range temp { i, j := ints[0], ints[1] grid[i][j] = max(maxCol[j], maxRow[i]) + 1 maxRow[i] = grid[i][j] maxCol[j] = grid[i][j] } return grid }
cpp 解法, 执行用时: 160 ms, 内存消耗: 45 MB, 提交时间: 2023-10-20 19:37:16
class Solution { public: vector<vector<int>> minScore(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(); // 将所有数字排序 vector<tuple<int, int, int>> nums; for (int r = 0; r < m; r++) { for (int c = 0; c < n; c++) { nums.push_back(make_tuple(grid[r][c], r, c)); } } sort(nums.begin(), nums.end()); // 从最小的数字开始填入,每次更新当前行和列的最大值 vector<int> row_max(m, 0); vector<int> col_max(n, 0); vector<vector<int>> ans(m, vector<int>(n, 0)); for (auto &[num, r, c] : nums) { ans[r][c] = max(row_max[r], col_max[c]) + 1; row_max[r] = ans[r][c]; col_max[c] = ans[r][c]; } return ans; } };
python3 解法, 执行用时: 328 ms, 内存消耗: 36.1 MB, 提交时间: 2023-10-20 19:36:59
class Solution: def minScore(self, grid: List[List[int]]) -> List[List[int]]: m, n = len(grid), len(grid[0]) # 将所有数字排序 nums = [] for r in range(m): for c in range(n): nums.append((grid[r][c], r, c)) nums.sort() # 从最小的数字开始填入,每次更新当前行和列的最大值 row_max = [0] * m col_max = [0] * n ans = [[0] * n for _ in range(m)] for num, r, c in nums: ans[r][c] = max(row_max[r], col_max[c]) + 1 row_max[r] = ans[r][c] col_max[c] = ans[r][c] return ans def minScore2(self, grid: List[List[int]]) -> List[List[int]]: m, n = len(grid), len(grid[0]) hasr, hasc, nhas, ss = [0] * m, [0] * n, [[0] * n for _ in range(m)], sorted([grid[i][j],i,j] for i in range(m) for j in range(n)) for v,i,j in ss: hasr[i] = hasc[j] = nhas[i][j] = max(hasr[i], hasc[j]) + 1 return nhas