区域和检索 - 不可变

给定一个数组,求出数组从索引 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


笔者第一个想到的就是,这么简单?直接循环不就行了。。。。然后956ms通过全部测试。。。。

再看看166ms的代码,先存储每步结果,最后直接return ,好吧,果然还是有小技巧的。

class NumArray {
    private int[] nums;
    private int[] numi;
    //这样,其实只需要构造的时候计算一次,相对于我们的来说,确实效率高多了,学习到了
    public NumArray(int[] nums) {
        this.nums = nums;
        numi=new int[this.nums.length+1];
        //这里可以避免nums为空数组的尴尬
        numi[0]=0;
        for(int i=0;i<nums.length;i++) {
            numi[i+1]=numi[i]+nums[i];
        }
    }

    public int sumRange(int i, int j) {
       return numi[j+1]-numi[i];
    }
}

猜你喜欢

转载自blog.csdn.net/zwzsdy/article/details/80155825
今日推荐