# 303. 区域和检索 - 数组不可变

## Link

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

## Problem

给定一个整数数组  `nums`，处理以下类型的多个查询:

1. 计算索引 `left` 和 `right` （包含 `left` 和 `right`）之间的 `nums` 元素的 **和** ，其中 `left <= right`

实现 `NumArray` 类：

* `NumArray(int[] nums)` 使用数组 `nums` 初始化对象
* `int sumRange(int i, int j)` 返回数组 `nums` 中索引 `left` 和 `right` 之间的元素的 **总和** ，包含 `left` 和 `right` 两点（也就是 `nums[left] + nums[left + 1] + ... + nums[right]` )

示例 1：

{% code overflow="wrap" %}

```
输入：
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出：
[null, 1, -1, -3]

解释：
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) 
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
```

{% endcode %}

提示：

* `1 <= nums.length <= 104`
* `-105 <= nums[i] <= 105`
* `0 <= i <= j < nums.length`
* 最多调用 `104` 次 `sumRange` 方法

## Solution

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

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


func Constructor(nums []int) NumArray {
    pre := make([]int, len(nums)+1)
    for i := range nums {
        pre[i+1] = pre[i] + nums[i] 
    }
    return NumArray{ pre: pre }
}


func (this *NumArray) SumRange(left int, right int) int {
    return this.pre[right+1] - this.pre[left]
}


/**
 * Your NumArray object will be instantiated and called as such:
 * obj := Constructor(nums);
 * param_1 := obj.SumRange(left,right);
 */
```

{% endtab %}

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

```cpp
```

{% endtab %}
{% endtabs %}
