开启掘金成长之旅!这是我参与「掘金日新计划 · 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]);
}
}
}
}