# 304. 二维区域和检索 - 矩阵不可变

## Link

{% embed url="<https://leetcode.cn/problems/range-sum-query-2d-immutable>" %}

## Problem

给定一个二维矩阵 `matrix`，以下类型的多个请求：

* 计算其子矩形范围内元素的总和，该子矩阵的 **左上角** 为 `(row1, col1)` ，**右下角** 为 `(row2, col2)` 。

实现 `NumMatrix` 类：

* `NumMatrix(int[][] matrix)` 给定整数矩阵 `matrix` 进行初始化
* `int sumRegion(int row1, int col1, int row2, int col2)` 返回 **左上角** `(row1, col1)` 、**右下角** `(row2, col2)` 所描述的子矩阵的元素 **总和** 。

示例 1：

&#x20;![](https://1992890748-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0qYY1ILl1K1crNjGMFmh%2Fuploads%2FmMVxdwpJunTtQHueyKBP%2Fimage.png?alt=media\&token=6648a5f4-5539-4603-8ed7-e01b6eab8ad2)

{% code overflow="wrap" %}

```
输入: 
["NumMatrix","sumRegion","sumRegion","sumRegion"]
[[[[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]]],[2,1,4,3],[1,1,2,2],[1,2,2,4]]
输出: 
[null, 8, 11, 12]

解释:
NumMatrix numMatrix = new NumMatrix([[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]]);
numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)
```

{% endcode %}

提示：

* `m == matrix.length`
* `n == matrix[i].length`
* `1 <= m, n <= 200`
* `-105 <= matrix[i][j] <= 105`
* `0 <= row1 <= row2 < m`
* `0 <= col1 <= col2 < n`
* 最多调用 `104` 次 `sumRegion` 方法

## Solution

{% tabs %}
{% tab title="Go" %}

```go
type NumMatrix struct {
    pre [][]int
}


func Constructor(matrix [][]int) NumMatrix {
    n, m := len(matrix), len(matrix[0])
    pre := make([][]int, n+1)
    for i := range pre {
        pre[i] = make([]int, m+1)
    }
    for i := range matrix {
        for j := range matrix[i] {
            pre[i+1][j+1] = pre[i][j+1] + pre[i+1][j] - pre[i][j] + matrix[i][j]
        }
    }
    return NumMatrix{pre}
}


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


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

{% endtab %}

{% tab title="C++" %}

```cpp
```

{% endtab %}
{% endtabs %}
