采用
前缀和
前缀和数组preSum
很好理解,preSum[i]
就是nums[0.....i-1]
的和,如果我们想求nums[i......j]
的和,只需要一步操作preSum[j+1]-preSum[i]
即可,而不需要我们重新去遍历数组
package BDyNamicProgramming;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/21 0021 15:33
*/
public class NumArray {
//动态规划:前缀和
//我们用动态规划记录前i个数据的和,那么sum(i,j)=dp[j]-dp[i]
private int[] sums;
//什么是前缀和
//前缀和的思路是这样的?
//对于一个给定的数组nums,我们额外开辟一个前缀和数组进行预处理
/*
int n = nums.length;
// 前缀和数组
int[] preSum = new int[n + 1];
preSum[0] = 0;
for (int i = 0; i < n; i++)
preSum[i + 1] = preSum[i] + nums[i];
*/
//这个前缀和数组preSum的含义也很好理解,preSum[i]就是nums[0...i-1]的和
//那么如果我们 想求nums[i...j]的和,只需要一步操作preSum[j+1]-preSum[i]即可
//而不需要重新去遍历数组
//什么时候会使用前缀和
//当需要数组中连续元素进行操作的时候(可以在遍历的时候进行某种操作)
//前缀和其实也是动态规划的一种
public NumArray(int[] nums) {
sums = new int[nums.length];
if (nums.length == 0) {
return;
}
sums[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
sums[i] += sums[i - 1] + nums[i];
}
}
public int sumRange(int i, int j) {
if (i == 0) {
return sums[j];
} else {
return sums[j] - sums[i - 1];
}
}
}