LeetCode: 304. Range Sum Query 2D - Immutable

题目描述

Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).

LeetCode: 304. Range Sum Query 2D - Immutable_i++


The above rectangle (with the red border) is defined by (row1, col1) = (2, 1) and (row2, col2) = (4, 3), which contains sum = 8.

Example:

Given matrix = [
[3, 0, 1, 4, 2],
[5, 6, 3, 2, 1],
[1, 2, 0, 1, 5],
[4, 1, 0, 1, 7],
[1, 0, 3, 0, 5]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12

Note:

  1. You may assume that the matrix does not change.
  2. There are many calls to sumRegion function.
  3. You may assume that row1 ≤ row2 and col1 ≤ col2.

解题思路 —— 动态规划

  1. 记 ​​topLeftSums[i][j]​​​ 表示矩阵 ​​(0, 0, i, j)​​ 的和
  2. 则 ​​topLeftSums[i+1][j+1] = topLeftSums[i+1][j] + sum(matrix[i+1][k])​​​, 其中 ​​k​​​ 是 ​​[0, j+1)​​​ 区间的整数。如图:

    3.如下图,矩阵 ​​​(row1, col1, row2, col2)​​​ 的和就是 ​​(0, 0, row2, col2) - (0, 0, row1-1, col2) - (0, 0, row2, col1-1) + (0, 0, row1-1, col1-1)​
  • ​(row1, col1, row2, col2)​​:
  • ​(0, 0, row2, col2) - (0, 0, row1-1, col2) - (0, 0, row2, col1-1) + (0, 0, row1-1, col1-1)​​:

AC 代码

type NumMatrix struct {
topLeftSums [][]int
}

func (this *NumMatrix) initNumMatrix(matrix [][]int) bool{
if len(matrix) == 0 {
return false
}

this.topLeftSums = make([][]int, len(matrix)+1)

for i := 0; i <= len(matrix); i++{
this.topLeftSums[i] = make([]int, len(matrix[0])+1)
}

return true
}

func Constructor(matrix [][]int) NumMatrix {
var sumMatrix NumMatrix

if len(matrix) == 0 {
return sumMatrix
}

sumMatrix.initNumMatrix(matrix)

for i := 0; i < len(matrix); i++{
for j := 0; j < len(matrix[i]); j++{
sumMatrix.topLeftSums[i+1][j+1] = sumMatrix.topLeftSums[i][j+1]
for k := 0; k < j+1; k++{
sumMatrix.topLeftSums[i+1][j+1] += matrix[i][k]
}
}
}

return sumMatrix
}


func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
return this.topLeftSums[row2+1][col2+1] + this.topLeftSums[row1][col1] -
this.topLeftSums[row2+1][col1] - this.topLeftSums[row1][col2+1]
}


/**
* Your NumMatrix object will be instantiated and called as such:
* obj := Constructor(matrix);
* param_1 := obj.SumRegion(row1,col1,row2,col2);
*/