LeetCode 2500: Delete Greatest Value in Each Row (Sort + Column Scan)
LeetCode 2500ArraySortingToday we solve LeetCode 2500 - Delete Greatest Value in Each Row.
Source: https://leetcode.com/problems/delete-greatest-value-in-each-row/
English
Problem Summary
In each operation, delete the largest value from every row, then add the largest among deleted values to answer. Repeat until grid is empty.
Key Insight
If each row is sorted ascending, then in round j, the removed value from row i is exactly grid[i][j] when scanning columns left to right. So each round answer is column maximum.
Complexity Analysis
Time: O(m * n log n) for sorting rows.
Space: O(1) extra (ignoring sort internals).
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution { public int deleteGreatestValue(int[][] grid) { for (int[] row : grid) java.util.Arrays.sort(row); int m = grid.length, n = grid[0].length, ans = 0; for (int j = 0; j < n; j++) { int mx = 0; for (int i = 0; i < m; i++) mx = Math.max(mx, grid[i][j]); ans += mx; } return ans; } }func deleteGreatestValue(grid [][]int) int { for i := range grid { sort.Ints(grid[i]) }; m, n := len(grid), len(grid[0]); ans := 0; for j := 0; j < n; j++ { mx := 0; for i := 0; i < m; i++ { if grid[i][j] > mx { mx = grid[i][j] } }; ans += mx }; return ans }class Solution { public: int deleteGreatestValue(vector<vector<int>>& grid) { for (auto& row : grid) sort(row.begin(), row.end()); int m = grid.size(), n = grid[0].size(), ans = 0; for (int j = 0; j < n; ++j) { int mx = 0; for (int i = 0; i < m; ++i) mx = max(mx, grid[i][j]); ans += mx; } return ans; } };class Solution:
def deleteGreatestValue(self, grid: List[List[int]]) -> int:
for row in grid:
row.sort()
ans = 0
for col in zip(*grid):
ans += max(col)
return ansvar deleteGreatestValue = function(grid) { for (const row of grid) row.sort((a,b)=>a-b); let ans = 0; for (let j = 0; j < grid[0].length; j++) { let mx = 0; for (let i = 0; i < grid.length; i++) mx = Math.max(mx, grid[i][j]); ans += mx; } return ans; };中文
题目概述
每轮从每一行删除最大值,再把这些被删值中的最大值加入答案,直到矩阵为空。
核心思路
把每一行升序排序后,第 j 轮从第 i 行删掉的值就是 grid[i][j]。所以每一轮只要取这一列的最大值并累加即可。
复杂度分析
时间复杂度:O(m * n log n)(逐行排序)。
空间复杂度:O(1) 额外空间(不计排序内部开销)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution { public int deleteGreatestValue(int[][] grid) { for (int[] row : grid) java.util.Arrays.sort(row); int m = grid.length, n = grid[0].length, ans = 0; for (int j = 0; j < n; j++) { int mx = 0; for (int i = 0; i < m; i++) mx = Math.max(mx, grid[i][j]); ans += mx; } return ans; } }func deleteGreatestValue(grid [][]int) int { for i := range grid { sort.Ints(grid[i]) }; m, n := len(grid), len(grid[0]); ans := 0; for j := 0; j < n; j++ { mx := 0; for i := 0; i < m; i++ { if grid[i][j] > mx { mx = grid[i][j] } }; ans += mx }; return ans }class Solution { public: int deleteGreatestValue(vector<vector<int>>& grid) { for (auto& row : grid) sort(row.begin(), row.end()); int m = grid.size(), n = grid[0].size(), ans = 0; for (int j = 0; j < n; ++j) { int mx = 0; for (int i = 0; i < m; ++i) mx = max(mx, grid[i][j]); ans += mx; } return ans; } };class Solution:
def deleteGreatestValue(self, grid: List[List[int]]) -> int:
for row in grid:
row.sort()
ans = 0
for col in zip(*grid):
ans += max(col)
return ansvar deleteGreatestValue = function(grid) { for (const row of grid) row.sort((a,b)=>a-b); let ans = 0; for (let j = 0; j < grid[0].length; j++) { let mx = 0; for (let i = 0; i < grid.length; i++) mx = Math.max(mx, grid[i][j]); ans += mx; } return ans; };
Comments