概述
有一个由数字组成的二维矩阵。目标 计算矩阵左上角(row1, col1)和右下角(row2, col2)所定义的矩形内的元素之和。
看上去很简单吧。只要在给定的数组中从左角到右角进行迭代并返回总和。但这里有一个问题。允许的TC是O(1)
下面是我们可以遵循的方法,这样我们就可以在O(1)的时间复杂度下返回答案了
-
为该2d矩阵预先计算另一个sum_array
-
sum_array[i][j] =左角(0,0)和 右角(i,j)的数字之和。
-
对于一个给定的左角(row1, col1)和右角(row2, col2)计算
topSum = sum_matrix[row1-1][col2]
leftSum = sum_matrix[row2][col1-1]
cornerSum = sum_matrix[row1-1][col1-1]
- 然后返回
sum_matrix[row2][col2] - topSum - leftSum + cornerSum
程序
下面是同样的程序。
package main
import "fmt"
type NumMatrix struct {
matrix [][]int
sum_matrix [][]int
numColumn int
numRows int
}
func initNumArray(matrix [][]int) NumMatrix {
numRows := len(matrix)
numColumn := len(matrix[0])
if numColumn == 0 || numRows == 0 {
return NumMatrix{}
}
sum_matrix := make([][]int, numRows)
for i := 0; i < numRows; i++ {
sum_matrix[i] = make([]int, numColumn)
}
sum_matrix[0][0] = matrix[0][0]
for i := 1; i < numRows; i++ {
sum_matrix[i][0] = matrix[i][0] + sum_matrix[i-1][0]
}
for i := 1; i < numColumn; i++ {
sum_matrix[0][i] = matrix[0][i] + sum_matrix[0][i-1]
}
for i := 1; i < numRows; i++ {
for j := 1; j < numColumn; j++ {
sum_matrix[i][j] = matrix[i][j] + sum_matrix[i-1][j] + sum_matrix[i][j-1] - sum_matrix[i-1][j-1]
}
}
num_matrix := NumMatrix{
matrix: matrix,
sum_matrix: sum_matrix,
numColumn: numColumn,
numRows: numRows,
}
return num_matrix
}
func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
topSum := 0
leftSum := 0
cornerSum := 0
if row1 > 0 {
topSum = this.sum_matrix[row1-1][col2]
}
if col1 > 0 {
leftSum = this.sum_matrix[row2][col1-1]
}
if row1 > 0 && col1 > 0 {
cornerSum = this.sum_matrix[row1-1][col1-1]
}
return this.sum_matrix[row2][col2] - topSum - leftSum + cornerSum
}
func main() {
matrix := [][]int{{1, 3, 5}, {6, 7, 4}}
na := initNumArray(matrix)
output := na.SumRegion(0, 1, 1, 2)
fmt.Println(output)
}
输出
19