刷题的日常-矩阵中的局部最大值

105 阅读2分钟

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

刷题的日常-2023年3月1号

一天一题,保持脑子清爽

矩阵中的局部最大值

来自leetcode的 2373 题,题意如下:

给你一个大小为 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 矩阵中的最大值。

返回生成的矩阵。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个二维数组
  • 要求我们生成新的一个二维矩阵。
  • 新的矩阵比给定的参数少两行,两列
  • 然后每个单位 maxLocal[i][j] 的取值为 grid[i + 1][j + 1] 为中心的九宫格中的最大值
  • 返回构造完成的矩阵

做题思路

简单题,直接暴力即可。

对于每一个取值,直接遍历原矩阵的九宫格,取最大值,然后赋值回去就完成了。步骤如下。

  • 开辟一个行列都比原矩阵长度都小 2 的数组
  • 每一行都需要进行初始化
  • 对于每一个位置,对原数组的位置进行取值
  • 取九宫格中最大值
  • 对于每一位,需要遍历的是行位置 到 行位置加 3
  • 列是取 列位置加 3的所有值

代码实现

代码实现如下:

public class Solution {
    public int[][] largestLocal(int[][] grid) {
        int cLen;
        int[][] res = new int[grid.length - 2][cLen = grid[0].length - 2];
        int[] row;
        for (int r = 0; r < res.length; r++) {
            row = res[r] = new int[cLen];
            for (int c = 0; c < row.length; c++) {
                calc(res, grid, r, c);
            }
        }
        return res;
    }
    private void calc(int[][] res, int[][] grid, int r, int c) {
        for (int i = r; i < r + 3; i++) {
            for (int j = c; j < c + 3; j++) {
                res[r][c] = Math.max(grid[i][j], res[r][c]);
            }
        }
    }
}

image.png