QUESTION:
Given a m x n matrix mat and an integer k, return a matrix answer where each answer[i][j] is the sum of all elements mat[r][c] for:
i - k <= r <= i + k, j - k <= c <= j + k, and (r, c) is a valid position in the matrix.
Example 1:
Input: mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
Output: [[12,21,16],[27,45,33],[24,39,28]]
Example 2:
Input: mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
Output: [[45,45,45],[45,45,45],[45,45,45]]
Constraints:
m == mat.length
n == mat[i].length
1 <= m, n, k <= 100
1 <= mat[i][j] <= 100
EXPLANATION:
比较简单, 其实就是把每个数的周围K个数的和即可, 那么可以拆分成两步: 取出当前的数, 再把对应的K方框的和求出来, 用一个helper函数来计算, 那么久转化成了对应方块的合理范围.
SOLUTION:
class Solution {
func matrixBlockSum(_ mat: [[Int]], _ k: Int) -> [[Int]] {
var result:[[Int]] = Array(repeating: Array(repeating: 0, count: mat[0].count), count: mat.count)
for indexI in mat.indices {
for indexJ in mat[indexI].indices {
result[indexI][indexJ] = matrixBlockSumHelper(mat, indexI, indexJ, k)
}
}
return result
}
func matrixBlockSumHelper(_ mat: [[Int]],_ i: Int, _ j: Int, _ k:Int) -> Int {
var sum:Int = 0
var startI:Int = i - k >= 0 ? i - k : 0
var endI:Int = i + k <= mat.count - 1 ? i + k : mat.count - 1
var startJ:Int = j - k >= 0 ? j - k : 0
var endJ:Int = j + k <= mat[i].count - 1 ? j + k : mat[i].count - 1
for indexI in startI...endI {
for indexJ in startJ...endJ {
sum += mat[indexI][indexJ]
}
}
return sum
}
}