[每日一题]2373.矩阵中的局部最大值

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 矩阵中的最大值

返回生成的矩阵。

20230301

输入: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 矩阵的最大值。

提示:

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

Solution

class Solution {
    public int[][] largestLocal(int[][] grid) {
        int row = grid.length;
        int col = grid[0].length;
        int[][] res = new int[row-2][col-2];
        int[][] newGrid = new int[row][col];

        for (int r = 1; r <= row - 2; r++) {
            for (int c = 1; c <= col - 2; c++) {
                int curMax = Integer.MIN_VALUE;
                for (int i = r - 1; i <= r + 1; i++) {
                    for (int j = c - 1; j <= c + 1; j++) {
                        curMax = Math.max(curMax, grid[i][j]);
                    }
                }
                newGrid[r][c] = curMax;
            }
        }

        for (int i = 0; i < res.length; i++) {
            for (int j = 0; j < res.length; j++) {
                res[i][j] = newGrid[i+1][j+1];
            }
        }
        return res;
    }
}

Ideas

遍历:

设 grid的大小为 n×n,那么我们申请一个大小为 (n−2)×(n−2) 的矩阵 res 用来存放答案。我们遍历 grid 中每个 3×3 子矩阵的左上角,然后统计当前子矩阵的最大值放入 res 中。

具体做法是,我们顺序遍历 i (0≤i<n−2),再顺序遍历 j (0≤j<n−2),接着遍历求解 {grid(x,y) ∣ i≤x<i+3,j≤y<j+3} 的最大值放入 res[i][j] 中。