【LeetCode】Range Sum Query 2D - Immutable 二维数组范围和

Range Sum Query 2D - Immutable 二维数组范围和

题意

在二维数组中求范围的和,需要注意的是:

  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.

解法

根据要求,可能会调用很多次的求和函数,设想如果范围比较大,那么简单的每次调用都要计算每行的和再累加显然是不符合题目的要求,因为题目说了矩阵是不可变的,因此我们可以使用动态规划,提前记录下矩阵中每个位置的范围和,最后再求指定范围的和。

首先构造一个二维数组sums[row+1][col+1],它记录的是从起始点(0,0)到给定的第row+1行和第col+1列的范围和,这里并不使用一个一个数进行累加的方法,而是利用动态规划的思想,根据前面的值来计算当前值。

既然已经知道每个位置代表的和,接下来根据公式:

也就是sums[row2+1][col2+1] - sums[row2+1][col1] - sums[row1][col2+1] + sums[row1][col1],因为其中多减了一次(r1, c1),所以要加一次回来才对。

最终实现如下:

class NumMatrix(object):
    def __init__(self, matrix):
        """
        :type matrix: List[List[int]]
        """
        self.row = len(matrix)
        if not self.row:
            return
        self.col = len(matrix[0])
        self.sums = [[0 for _ in range(self.col+1)] for _ in range(self.row+1)]
        for i in range(1, self.row+1):
            for j in range(1, self.col+1):
                self.sums[i][j] = self.sums[i-1][j] + self.sums[i][j-1] - self.sums[i-1][j-1] + matrix[i-1][j-1]
    def sumRegion(self, row1, col1, row2, col2):
        """
        :type row1: int
        :type col1: int
        :type row2: int
        :type col2: int
        :rtype: int
        """
        return self.sums[row2+1][col2+1] - self.sums[row2+1][col1] - self.sums[row1][col2+1] + self.sums[row1][col1]
# Your NumMatrix object will be instantiated and called as such:
# obj = NumMatrix(matrix)
# param_1 = obj.sumRegion(row1,col1,row2,col2)
posted @ 2017-10-08 09:11  banananana  阅读(246)  评论(0)    收藏  举报