privateval m = matrix.size privateval n = matrix[0].size
val preSum = Array(m) { IntArray(n) { 0 } }
init { // 求二维前缀和 preSum[0][0] = matrix[0][0] for (j in1 until n) { preSum[0][j] = preSum[0][j - 1] + matrix[0][j] } for (i in1 until m) { preSum[i][0] = preSum[i - 1][0] + matrix[i][0] } for (i in1 until m) { for (j in1 until n) { val left = preSum[i][j - 1] val top = preSum[i - 1][j] val leftTop = preSum[i - 1][j - 1] preSum[i][j] = left + top - leftTop + matrix[i][j] } } }
funsumRegion(row1: Int, col1: Int, row2: Int, col2: Int): Int { val all = preSum[row2][col2] val left = if (col1 == 0) 0else preSum[row2][col1 - 1] val top = if (row1 == 0) 0else preSum[row1 - 1][col2] val leftTop = if (row1 == 0 || col1 == 0) 0else preSum[row1 - 1][col1 - 1] return all - left - top + leftTop }