问题链接:点击打开链接
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
Example:
Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3
Note:
- You may assume that the array does not change.
- There are many calls to sumRange function.
public class NumArray {
int[] nums;
public NumArray(int[] nums) {
this.nums = Arrays.copyOfRange(nums, 0, nums.length);
}
public int sumRange(int i, int j) {
int result = 0;
if(i <= j) {
for(int index=i;index<=j;index++) {
result += nums[index];
}
}
return result;
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
运行通过,但是在测试用例的一个报错为Time Limit Exceeded,原因是没有考虑到题目提示的数组不变且多次调用,没有这部分的优化,每次调用都要重新计算,导致时间成本太大。
答案给出的方案是在初始化时就进行运算,每次调用只要简单相减即可。
public class NumArray {
int[] nums;
public NumArray(int[] nums) {
for(int i = 1; i < nums.length; i++)
nums[i] += nums[i - 1];
this.nums = nums;
}
public int sumRange(int i, int j) {
if(i == 0)
return nums[j];
return nums[j] - nums[i - 1];
}
}
教训:没有充分理解题目给出的意思:多次调用、题目中的Immutable
不要受固定思维的影响:认为构造函数传递过来的参数与Solution类中的存储变量是简单的重复