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];//由前缀和得解 } }