943. Range Sum Query - Immutable
Given an integer array nums, find the sum of the elements between indices i
and j
(i ≤ j)
, inclusive.
样例
Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
注意事项
- You may assume that the array does not change.
- There are many calls to
sumRange
function。
解题思路:题目的意思是给定一个数组,然后求出给定范围内的和。第一反应当然是遍历了。
代码如下:
class NumArray {
int dp[];
public NumArray(int[] nums) {
int len = nums.length;
dp = new int[len];
for(int i=0;i<len;i++)
dp[i]=nums[i];
}
public int sumRange(int i, int j) {
if(dp == null)
return 0;
int sum = 0;
for(int pos = i;pos<=j;pos++)
sum+=dp[pos];
return sum;
}
}
运行一下:
过了,但是能不能继续进行优化呢?
答案当然是可以的,运用动态规划的知识,开辟一个数组,每个位置存的是前面和当前位置数值的累加和,用的时候直接取不就行了吗。。。
代码:
class NumArray {
int dp[];
public NumArray(int[] nums) {
int len = nums.length;
dp = new int[len];
dp[0] = nums[0];
for(int i=1;i<len;i++)
dp[i] = dp[i-1]+nums[i];
}
public int sumRange(int i, int j) {
if(dp == null)
return 0;
if(i==0)
return dp[j];
else
return dp[j]-dp[i-1];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/