给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
示例:
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

sumRange(0, 2) -> 1 
sumRange(2, 5) -> -1 
sumRange(0, 5) -> -3 

说明:

你可以假设数组不可变。 会多次调用 sumRange 方法。

思路: 此题一看,第一反应就是线段树,但是,由于数组不可变,那么用数组解决更为方便快速,开一个数组,将前n个元素的和记录在数组中,数组的长度需要比元素个数多一,用于储存前0个元素的和这个值
,然后用前n个sum相减,就能得到两个sum之间的区间的值

package SegmentTree;


/** * @author BestQiang * leet-code 303.区域和搜索-数组不可变 */
public class NumArray {

       private int[] sum; // sum[i]储存前i个元素和, sum[0] = 0 sum[i]储存nums[0...i-1]的和
    public NumArray2(int[] nums) {
        // 因为有计算前零个nums元素的长度,所以声明sum数组的长度为nums的长度加一
        sum = new int[nums.length + 1];
        // 要记录sum[0],因为这也是一个区间
        sum[0] = 0;
        // 对sum数组的值进行遍历赋值
        for(int i = 1; i < sum.length; i ++) {
            // 就如此时sum[1]对应的元素和是nums[0],因为sum[0]被占了,这个意思懂吧,所以推导到下面的公式
            sum[i] = sum[i - 1] + nums[i - 1];
        }
    }


    // 求i到j区间的和,注意是闭区间
    public int sumRange(int i, int j) {
        return sum[j + 1] - sum[i];
    }
}