给定一个数组,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
例如:
给定nums = [-2, 0, 3, -5, 2, -1],求和函数为sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
笔者第一个想到的就是,这么简单?直接循环不就行了。。。。然后956ms通过全部测试。。。。
再看看166ms的代码,先存储每步结果,最后直接return ,好吧,果然还是有小技巧的。
class NumArray {
private int[] nums;
private int[] numi;
//这样,其实只需要构造的时候计算一次,相对于我们的来说,确实效率高多了,学习到了
public NumArray(int[] nums) {
this.nums = nums;
numi=new int[this.nums.length+1];
//这里可以避免nums为空数组的尴尬
numi[0]=0;
for(int i=0;i<nums.length;i++) {
numi[i+1]=numi[i]+nums[i];
}
}
public int sumRange(int i, int j) {
return numi[j+1]-numi[i];
}
}