[周赛] 6148. 矩阵中的局部最大值

77 阅读1分钟

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

每日刷题 2022.08.14

题目

  • 给你一个大小为 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

解题思路

  • 由于自己没有读清楚题目,因此选择了一种比较绕的做法,也就是比较容易出错的做法。
  • 因为题目中说要3 * 3矩阵的大小,求取最大值。因此就先将每一行划分成3个一组,注意:这里的划分,不是1,2,3 然后 4,5,6这样划分,而是1,2,3 接着 2,3,4。划分的方式不要弄错了!
  • 因为对于每一行和每一列都是一样的操作,因此可以将其拆分开,变成每一行的3个一组求取最大值记为ans数组,之后再对ans数组进行每一列的3个一组的求解,记为res。最终直接返回res即可。

仔细读题

  • 这是周赛的第一道题,按道理来说应该没有那么难才对。仔细读题后发现,自己忽略了一些题目中所给的信息。
  • 根据题意可知:原始的矩阵为n * n,需要返回一个n - 2 * n - 2这样的矩阵,也就是去掉原始矩阵的最外层,剩下的矩阵。对于每一个maxLocal[i][j]在原始矩阵中都有i + 1, j + 1为中心的3 * 3矩阵,需要计算这样的3 * 3矩阵中的最大值。
  • 那么获取到这些信息后,可以知道求取的最大值,就应该放在中心上,也就是遍历整个3 * 3矩阵中的所有值,最终将最大值放在中心点上。
  • 循环对每一个中心点都如此操作即可。

疑问

  • 还存在一个疑问,就是一行如果有5个格子,那么可以将5个格子分成几个3一组的,答案是5 - 2 = 3

AC代码

/**
 * @param {number[][]} grid
 * @return {number[][]}
 */
var largestLocal = function(grid) {
  // 计算每一行
  let n = grid.length, g = grid, m = -Infinity, ans = [];
  for(let i = 0; i < n; i++) {
    let cur = [];
    for(let j = 0; j <= n - 3;) {
      let idx = 3;
      m = g[i][j];
      while(idx > 0) {
        m = Math.max(g[i][j], m);
        idx--;
        j++;
      }
      cur.push(m);
      j = j - 3 + 1;
    }
    ans.push(cur);
  }
  // console.log(ans)
  let a = ans[0].length, mm = -Infinity, res = [];
  for(let j = 0; j <= n - 3;) {
    let cur = [];
    for(let i = 0; i < a; i++) {
      let id = 3;
      // console.log(j, i,ans)
      mm = ans[j][i];
      while(id > 0) {
        mm = Math.max(ans[j][i], mm);
        id--;
        j++;
      }
      cur.push(mm);
      j = j - 3;
    }
    j = j + 1;
    res.push(cur)
  }
  return res;
};