携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
每日刷题 2022.08.14
- leetcode原题链接:leetcode.cn/problems/la…
- 难度:简单
- 方法:模拟
题目
- 给你一个大小为 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
输入: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
输入: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].length3 <= n <= 1001 <= 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;
};