矩阵中的局部最大值

460 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是处于什么原因,算法学习需要持续保持,今天让我们一起来看看这一道题目————矩阵中的局部最大值

题目描述

给你一个大小为 n x n 的整数矩阵 grid 。

生成一个大小为 (n - 2) x (n - 2) 的整数矩阵  maxLocal ,并满足:

maxLocal[i][j] 等于 grid 中以 i + 1 行和 j + 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说,我们希望找出 grid 中每个 3 x 3 矩阵中的最大值。

返回生成的矩阵。

示例 1:

image.png

输入:grid = [[9,9,8,1],[5,6,2,6],[8,2,6,4],[6,2,2,2]]
输出:[[9,9],[8,6]]
解释:原矩阵和生成的矩阵如上图所示。
注意,生成的矩阵中,每个值都对应 grid 中一个相接的 3 x 3 矩阵的最大值。

示例 2:

image.png

输入:grid = [[1,1,1,1,1],[1,1,1,1,1],[1,1,2,1,1],[1,1,1,1,1],[1,1,1,1,1]]
输出:[[2,2,2],[2,2,2],[2,2,2]]
解释:注意,2 包含在 grid 中每个 3 x 3 的矩阵中。

提示:

  • n == grid.length == grid[i].length
  • 3 <= n <= 100
  • 1 <= grid[i][j] <= 100

思路分析

首先我们应该先读一遍题目,读完题目后我们会发现,今天的这道题目好像有点简单。题目会给我们一个n x n 的整数矩阵,我们需要生成一个大小为 (n - 2) x (n - 2) 的整数矩阵。

image.png

如上图,为示例一的生成图例,生成的矩阵中分别为4个九宫格的最大值,题目的数据规模为3 <= n <= 100,我们可以直接暴力计算每一个九宫格的最大值。

  • 1、遍历每一行
for(let i = 0; i < grid.length - 2; i++){
}
  • 2、遍历每一列
 for(let j = 0; j < grid[i].length - 2; j++){
 }
  • 3、以当前格子为左上顶点,遍历九宫格
for(let k = i; k < i + 3; k++){
     for(let l = j; l < j + 3; l++){
         max = Math.max(grid[k][l],max);
     }
 }
  • 4、获取九宫格中的最大值
max = Math.max(grid[k][l],max);

AC代码

/**
 * @param {number[][]} grid
 * @return {number[][]}
 */
 var largestLocal = function(grid) {
     let res = new Array(grid.length - 2);
     for(let i = 0; i < grid.length - 2; i++){
         for(let j = 0; j < grid[i].length - 2; j++){
             let max = grid[i][j];
             for(let k = i; k < i + 3; k++){
                 for(let l = j; l < j + 3; l++){
                     max = Math.max(grid[k][l],max);
                 }
             }
             if(!res[i]) res[i] = [];
             res[i].push(max);
         }
     }
     return res;
};

说在后面

🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。