classSolution{ funmatrixBlockSum(mat: Array<IntArray>, k: Int): Array<IntArray> { val m = mat.size val n = mat[0].size val preSum = Array(m) { IntArray(n) { 0 } } val answer = Array(m) { IntArray(n) { 0 } }
// 计算二维前缀和 preSum[0][0] = mat[0][0] for (r in1 until m) preSum[r][0] = mat[r][0] + preSum[r - 1][0] for (c in1 until n) preSum[0][c] = mat[0][c] + preSum[0][c - 1] for (r in1 until m) { for (c in1 until n) { preSum[r][c] = mat[r][c] + preSum[r - 1][c] + preSum[r][c - 1] - preSum[r - 1][c - 1] } }
// 求解区域和 for (r in0 until m) { for (c in0 until n) { val leftTopX = maxOf(r - k, 0) val leftTopY = maxOf(c - k, 0) val rightBottomX = minOf(r + k, m - 1) val rightBottomY = minOf(c + k, n - 1)
val wholeArea = preSum[rightBottomX][rightBottomY] val leftArea = if (leftTopX == 0) 0else preSum[leftTopX - 1][rightBottomY] val topArea = if (leftTopY == 0) 0else preSum[rightBottomX][leftTopY - 1] val leftTopArea = if (leftTopX == 0 || leftTopY == 0) 0else preSum[leftTopX - 1][leftTopY - 1] answer[r][c] = wholeArea - leftArea - topArea + leftTopArea } } return answer } }