echo

任生命穿梭 时间的角落

0%

区域和检索 - 数组不可变

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

给定一个整数数组 nums*,求出数组从索引 *ij (ij) 范围内元素的总和,包含 i, j 两点。

示例:

1
2
3
4
5
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

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

说明:

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

注意到 “假设数组不可变” 这个条件,我们可以自然地想到直接将一些区域和存储起来,多次调用 sumRange 方法时只用 O(1) 时间复杂度就可以得到结果。

在数组初始化的时候生成一个前 n 项和的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class NumArray {

private int[] sum;

public NumArray(int[] nums) {
sum = new int[nums.length+1];

for(int i=0;i<nums.length;++i){
//sum[i] 代表前 i (i>=1) 个元素的和
sum[i+1] = sum[i] + nums[i];
}
}

public int sumRange(int i, int j) {
//第i+1个 到 j+1个元素的和
return sum[j+1] - sum[i];
}
}

/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/

时间复杂度O(n),空间复杂度O(n)。