1314. 矩阵区域和

矩阵区域和

题目描述:

给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:

i - k <= r <= i + k,
j - k <= c <= j + k 且
(r, c) 在矩阵内。

示例 1:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[12,21,16],[27,45,33],[24,39,28]]
示例 2:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
输出:[[45,45,45],[45,45,45],[45,45,45]]

提示:

m == mat.length
n == mat[i].length
1 <= m, n, k <= 100
1 <= mat[i][j] <= 100

思路:

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

得先求得二维矩阵前缀和的方法

代码:

func matrixBlockSum(mat [][]int, k int) [][]int {
    m,n := len(mat), len(mat[0])
    dp := make([][]int, m+1)
    res := make([][]int, m)
    for i:=0;i<=m;i++{
        dp[i] = make([]int, n+1)
    }
    for i:=0;i<m;i++{
        res[i] = make([]int, n)
    }
    for i:=1;i<=m;i++{
        for j:=1;j<=n;j++{
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]+ mat[i-1][j-1]
        }
    }

    for i:=0;i<m;i++{
        for j:=0;j<n;j++{
            li,lj,ri,rj := max(0,i-k),max(0,j-k), min(m,i+k+1),min(n, j+k+1)
            res[i][j] = dp[ri][rj] - dp[li][rj] - dp[ri][lj] + dp[li][lj]
        }
    }
    return res
}

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

func min(a,b int)int{
    if a<b{
        return a
    }
    return b 
}

代码效率:

执行用时:8 ms, 在所有 Go 提交中击败了81.40%的用户
内存消耗:6.1 MB, 在所有 Go 提交中击败了46.51%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!