题目
类型:前缀和
解题思路
这道题的最优解法是使用前缀和将sumRange
函数的时间复杂度降到O(1)
,避免使用for循环
核心思路是我们new一个新的数组preSum
出来,preSum[i]
记录nums[0..i-1]
的累加和
preSum
数组 ,如果想求得索引区间[1,4]
内所有元素就可以通过preSum[5]-preSum[1]
得出
代码
class NumArray {
private int[] preSum;
public NumArray(int[] nums) {
preSum = new int[nums.length + 1];
for (int i = 1; i < preSum.length; i++){
preSum[i] = preSum[i - 1] + nums[i - 1];
}
}
public int sumRange(int left, int right) {
return preSum[right + 1] - preSum[left];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(left,right);
*/