题目
给定一个整数数组 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]))
例子
思路
妹想很复杂,就来个对象属性,直接把输入赋予给这个属性,然后一个循环遍历就好了。
class NumArray {
public int[] arr;
public NumArray(int[] nums) {
this.arr = nums;
}
public int sumRange(int i, int j) {
int cnt = 0;
for(int k=i;i<=j;i++){
cnt += this.arr[i];
}
return cnt;
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
果然,这么简单的想法是相当慢的,主要是因为当sumrange被频繁调用时,需要频繁进行循环计算,因此用时较长。
为了避免这个情况,可以考虑一开始就把前n项和存储下来,那么当计算sumrange时只要直接计算,不再需要循环。
class NumArray {
public int[] sum;
public NumArray(int[] nums) {
int n = nums.length;
sum = new int[n+1];
for(int i=0;i<n;i++){
sum[i+1] = nums[i] + sum[i];
}
}
public int sumRange(int i, int j) {
return sum[j+1]-sum[i];
}
}
这