[算法] 剑指offer2 golang 面试题13:二维子矩阵的数字之和
题目1:
思路1: 暴力模拟
暴力模拟
代码
type NumMatrix struct {
Matrix [][]int
}
func Constructor(matrix [][]int) NumMatrix {
return NumMatrix{Matrix: matrix}
}
//start: 17:05
//二维子矩阵的元素和
//思路: 遍历子矩阵的每一行累加值即可
func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
//参数处理 todo
//矩阵
//行i,列j
sum := 0
for i:=row1; i <= row2; i++ {
for j:=col1; j <= col2; j++{
sum += this.Matrix[i][j]
}
}
return sum
}
/**
* Your NumMatrix object will be instantiated and called as such:
* obj := Constructor(matrix);
* param_1 := obj.SumRegion(row1,col1,row2,col2);
*/
思路2: 提前算好每个区域的值然后最后计算
比如计算蓝色区域1的值可以等于红色区域2减去绿色区域3和其他区域4和5
我们在构造的时候记录好矩形左上到右下位置的值然后获得每个区域的时候时间复杂度是 O(1)
代码2
type NumMatrix struct {
sums [][]int
}
func Constructor(matrix [][]int) NumMatrix {
//第一行
for j:=1; j < len(matrix[0]); j++{
matrix[0][j] = matrix[0][j-1] + matrix[0][j]
}
//第2-n行
for i:=1; i < len(matrix); i++ {
sum := 0
for j:=0; j < len(matrix[0]); j++{
sum += matrix[i][j]
matrix[i][j] = sum + matrix[i-1][j]
}
}
return NumMatrix{sums: matrix}
}
//start: 17:05
//二维子矩阵的元素和
//思路2: 提前计算好(0,0)到每个点的sum然后第二次计算就能O(1)
//a1 - a2 - a3 -a4
func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
a1 := this.sums[row2][col2]
a2 := 0
a3 := 0
a4 := 0
if row1 >= 1 {
a2 = this.sums[row1-1][col1]
if col1 >= 1 {
a2 = this.sums[row1-1][col1-1]
}
}
if row1 >= 1 {
a3 = this.sums[row1-1][col2] - a2
}
if col1 >= 1 {
a4 = this.sums[row2][col1-1] - a2
}
return a1 - a2 - a3 - a4
}
/**
* Your NumMatrix object will be instantiated and called as such:
* obj := Constructor(matrix);
* param_1 := obj.SumRegion(row1,col1,row2,col2);
*/