难度简单278
给定一个整数数组 nums
,求出数组从索引 i
到 j
(i ≤ j
)范围内元素的总和,包含 i
、j
两点。
实现 NumArray
类:
NumArray(int[] nums)
使用数组nums
初始化对象int sumRange(int i, int j)
返回数组nums
从索引i
到j
(i ≤ j
)范围内元素的总和,包含i
、j
两点(也就是sum(nums[i], nums[i + 1], ... , nums[j])
)
今天这个题目让我们求一个区间 [i, j]
内的和,求区间和可以用 preSum 来做,即前缀和。
preSum 方法能快速计算指定区间段 i−j 的元素之和。它的计算方法是从左向右遍历数组,当遍历到数组的 i位置时,preSum 表示 i位置左边的元素之和。
假设数组长度为 N,我们定义一个长度为 N+1 的 preSum 数组,preSum[i] 表示该元素左边所有元素之和(不包含 i 元素)。然后遍历一次数组,累加区间 [0, i) 范围内的元素,可以得到 preSum 数组。
利用 preSum 数组,可以在 O(1) 的时间内快速求出 nums 任意区间 [i, j] (两端都包含) 的各元素之和。
sum(i, j) = preSum[j + 1] - preSum[i]
class NumArray {//前缀和
int preSum[];
public NumArray(int[] nums) {
int n = nums.length;
preSum = new int[n+1];
for(int i=0;i<n;i++){
preSum[i+1] = nums[i]+preSum[i];
}
}
public int sumRange(int i, int j) {
return preSum[j+1] - preSum[i];
}
}