题目
给定一个整数数组 nums,求出数组从索引 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
说明:
你可以假设数组不可变。
会多次调用 sumRange 方法。
思路
1.一开始我就想的是直接用循环,结果提交显示超时。分析原因:如果只是一次调用sumRange 方法,直接循环求解最容易。但是题目说要多次使用sumRange 方法,也就是每次调用这个方法,都会循环若干次,需要的时间也就更多了。
2.在网上看了一下别人的思路,先把结果每次计算存起来,然后求哪个直接可以返回结果。这样的好处就是不管使用多少次sumRange 方法,都只用循环一次即可。
代码如下:
class NumArray {
private int[] nums;
private int[] numi;
public NumArray(int[] nums) {
this.nums = nums;
numi = new int[nums.length+1];
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];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/