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

 

  题目的大意是NumArray方法初始化数组,sumRange求一个区间内的数字和

  其中sumRange方法会被多次调用,因此要想出一个降低其时间复杂度的求和算法。

思路:前缀和

  前缀和,即数组中第i个元素及其之前元素的和。

  sumRange(i,j)等于 j 的前缀和 减去 i-1 的前缀和

  在此题中,创建一个 sums 数组记录 nums 数组的前缀和,可以将sumRange的时间复杂度从O(n)降至O(1)

代码:

  时间复杂度O(n)(计算前缀和),空间复杂度O(n)(前缀和数组)

class NumArray {
    int[] sums;
    public NumArray(int[] nums) {
        if (nums.length == 0)
            return;
        sums = new int[nums.length];
        sums[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            sums[i] += sums[i - 1] + nums[i];//求前缀和
        }
    }

    
    public int sumRange(int i, int j) {
        if (i == 0)
            return sums[j];
        else
            return sums[j] - sums[i - 1];//由前缀和得解
    }
}
posted @ 2021-03-01 21:50  zjcfrancis  阅读(34)  评论(0编辑  收藏  举报