删除每行中的最大值

211 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

问题描述

给你一个 m x n 大小的矩阵 grid ,由若干正整数组成。

执行下述操作,直到 grid 变为空矩阵:

  • 从每一行删除值最大的元素。如果存在多个这样的值,删除其中任何一个。
  • 将删除元素中的最大值与答案相加。

注意 每执行一次操作,矩阵中列的数据就会减 1 。

返回执行上述操作后的答案。

示例 1:

输入: grid = [[1,2,4],[3,3,1]]
输出: 8
解释: 上图展示在每一步中需要移除的值。
- 在第一步操作中,从第一行删除 4 ,从第二行删除 3(注意,有两个单元格中的值为 3 ,我们可以删除任一)。在答案上加 4 。
- 在第二步操作中,从第一行删除 2 ,从第二行删除 3 。在答案上加 3 。
- 在第三步操作中,从第一行删除 1 ,从第二行删除 1 。在答案上加 1 。
最终,答案 = 4 + 3 + 1 = 8

示例 2:

输入: grid = [[10]]
输出: 10
解释: 上图展示在每一步中需要移除的值。
- 在第一步操作中,从第一行删除 10 。在答案上加 10 。
最终,答案 = 10

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • 1 <= grid[i][j] <= 100

思路分析

首先我们先要理解一下题意,题目会给我们一个m x n 大小的矩阵 grid,我们需要进行n次操作将矩阵变为空矩阵,每一次操作我们需要从每一行删除值最大的元素。如果存在多个这样的值,可以删除其中任何一个。而且在删除的时候我们需要将被每一次删除元素中的最大值与答案相加。转换一下思路的话,我们可以将问题变成这样,求矩阵中每一列中的最大值之和,但是需要加个前置条件,每一行的元素都是排好序的。所以我们可以这样做:

  • 1、将矩阵每一行元素按大小进行排序

这里我们可以按从大到小进行排序,也可以从小到大进行排序,只要每一行的排序规则一样,并不会对结果造成影响。

for(let i = 0; i < grid.length; i++){
     grid[i].sort((a,b)=>a - b);
 }
  • 2、获取每一列的最大值

矩阵的每一行排好序之后,我们可以直接遍历求取每一列的最大值。

for(let i = 0; i < grid[0].length; i++){
     let max = grid[0][i];
     for(let j = 0; j < grid.length; j++){
         max = Math.max(max,grid[j][i]);
     }
     res += max;
 }

AC代码

完整AC代码如下:

/**
 * @param {number[][]} grid
 * @return {number}
 */
 var deleteGreatestValue = function(grid) {
     let res = 0;
     for(let i = 0; i < grid.length; i++){
         grid[i].sort((a,b)=>a - b);
     }
     for(let i = 0; i < grid[0].length; i++){
         let max = grid[0][i];
         for(let j = 0; j < grid.length; j++){
             max = Math.max(max,grid[j][i]);
         }
         res += max;
     }
     return res;
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。