列表

详情


2373. 矩阵中的局部最大值

给你一个大小为 n x n 的整数矩阵 grid

生成一个大小为 (n - 2) x (n - 2) 的整数矩阵  maxLocal ,并满足:

换句话说,我们希望找出 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 的矩阵中。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<vector<int>> largestLocal(vector<vector<int>>& grid) { } };

golang 解法, 执行用时: 12 ms, 内存消耗: 6.2 MB, 提交时间: 2022-08-23 10:17:22

func largestLocal(grid [][]int) [][]int {
	n := len(grid)
	for i, row := range grid[:n-2] {
		for j := 0; j < n-2; j++ {
			mx := 0
			for _, r := range grid[i : i+3] {
				for _, v := range r[j : j+3] {
					mx = max(mx, v)
				}
			}
			row[j] = mx
		}
		grid[i] = row[:n-2]
	}
	return grid[:n-2]
}

func max(a, b int) int { if b > a { return b }; return a}

python3 解法, 执行用时: 96 ms, 内存消耗: 15.2 MB, 提交时间: 2022-08-23 10:17:06

class Solution:
    def largestLocal(self, grid: List[List[int]]) -> List[List[int]]:
        # 把最大值直接保存在 3 × 3 矩阵的左上角,这样可以无需创建返回矩阵。
        n = len(grid)
        for i in range(n - 2):
            for j in range(n - 2):
                grid[i][j] = max(max(row[j:j + 3]) for row in grid[i:i + 3])
            del grid[i][-2:]
        del grid[-2:]  # 不要直接 return grid[:-2] 那样会有额外的拷贝
        return grid

java 解法, 执行用时: 3 ms, 内存消耗: 42.8 MB, 提交时间: 2022-08-23 10:15:51

class Solution {
    public int[][] largestLocal(int[][] grid) {
        int n = grid.length;
        int size = 3;
        int[][] convolution = new int[n - size + 1][n - size + 1];
        // 步长1,类似计算3*3卷积
        for (int i = 0; i <= n - size; i++) {
            for (int j = 0; j <= n - size; j++) {
                convolution[i][j] = findMaxVal(grid, i, j, size);
            }
        }

       return convolution;
    }

    // 遍历子矩阵查找找最大值
    private int findMaxVal(int[][] grid, int i, int j, int size) {
        int maxVal = grid[i][j];
        for (int p = i; p < i + size; p++) {
            for (int q = j; q < j + size; q++) {
                if (grid[p][q] >= maxVal) {
                    maxVal = grid[p][q];
                }
            }
        }
        return maxVal;
    }
}

上一题