方法:模拟

创建答案数组

弄清***射关系,对于答案填入的位置(0,0),相当于原数组 (0,0)到(2,2),也就是 x 和 y 个自需要在当前和加三个位置比较最大值

填入答案,返回

class Solution {    public int[][] largestLocal(int[][] grid) {        int n = grid.length;        int[][] ans = new int[n-2][n-2];        for(int i = 0; i < n-2; i++){            for(int j = 0; j < n-2; j++){                for(int mx = 0; mx < 3; mx++){                    for(int my = 0; my < 3; my++){                        ans[i][j] = Math.max(grid[i+mx][j+my],ans[i][j]);                    }                }            }        }        return ans;    }}

func largestLocal(grid [][]int) [][]int {    n := len(grid)    ans := make([][]int,n-2)    for i:=0; i < n-2; i++{        ans[i]=make([]int,n-2)        for j:= 0; j < n-2; j++{            for mx:= 0; mx < 3; mx++{                for my:=0; my < 3; my++{                    ans[i][j] = max(grid[i+mx][j+my],ans[i][j])                }            }        }    }    return ans}
func max(a int, b int) int{if a>b{return a};return b}

时间复杂度:O(n^2t^2)integer最大值是多少,t为子矩阵

空间复杂度:O(1)integer最大值是多少,除了答案不占据额外空间

彩蛋讨论:如果希望获得的子矩阵不再固定为3,而是和原矩阵的大小有可能一致,原矩阵扩展到 1e3,该怎么写呢?

我们可以考虑,先算出一行中连续 t 个元素的最大值

然后根据上述结果再算出一列中连续 t 个元素的最大值(相当于你要求10*10个数的最大值,每行选出一个最大值,然后胜出的10个最大值里再选出一个最大值)

连续 x 个元素的最大值,可以使用堆懒删除的方式处理

class Solution {        public int[][] largestLocal(int[][] grid) {            int n = grid.length;            int[][] prey = new int[n][n];            int t = 3;            for(int i = 0; i < n; i++){                int finalI = i;                PriorityQueue pq = new PriorityQueue((a, b)->grid[finalI][b]-grid[finalI][a]);                for(int j = 0; j < n; j++){                    pq.offer(j);                    while (pq.peek()<=j-t) pq.poll();                    prey[i][j] = grid[i][pq.peek()];                }            }            int[][] ans = new int[n-t+1][n-t+1];            for(int j = t-1; j < n; j++){                int finalJ = j;                PriorityQueue pq = new PriorityQueue((a, b)->prey[b][finalJ]-prey[a][finalJ]);                for(int i = 0; i < n; i++){                    pq.offer(i);                    while (pq.peek()<=i-t) pq.poll();                    if(i>=t-1){                        ans[i-t+1][j-t+1] = prey[pq.peek()][j];                    }                }            }
return ans; } }

时间复杂度:O(n^2logn)

空间复杂度:O(n^2)