问题:如何求得一维数组从a[x]~a[y]的累加和?
1.假设
假设有一个数组arr[5]={1,2,3,4,5},我们想求得arr[2]~arr[4]的累加和,那么就要实现sum=arr[2]+arr[3]+arr[4]这一操作;
所以如果我们想求得arr[l]~arr[r]的和,那么就要重复以上操作
复杂思路是建立一个正方形表格,把所有可能出现的累加和都记录下来,随时调用,但可能会显得麻烦,而且时间复杂度和空间复杂度都变高了
2.使用前缀和数组
假设有一个一维数组preSum[5],把从arr[0]~arr[0]的和放入preSum[0],把arr[0]~arr[1]的和放入preSum[1],把arr[0]~arr[2]的和放入preSum[2]……该数组就为前缀和数组;
那么我们求得arr[l]~arr[r]的和就变得简单了
sum就等于preSum[r]-preSum[l-1],如果l=0,那么sum就直接等于preSum[r];
public static int rangeSum2(int l,int r){
return l==0?preSum[r] :preSum[r]-preSum[l-1];
}
3.如何用code实现preSum?
1.建立一个与arr等长的数组preSum
2.让preSum[0]=arr[0]
3.for循环里让preSum[i]的值等于preSum[i-1]+arr[i];
public class Sum {
private static int preSum[];
public static void rangeSum(int[]arr){
int n=arr.length;
preSum=new int[n];
preSum[0]=arr[0];
for(int i=1;i<n;i++){
preSum[i]=preSum[i-1]+arr[i];
}
}
4.完整代码
package class01;
public class Sum {
private static int preSum[];
public static void rangeSum(int[]arr){
int n=arr.length;
preSum=new int[n];
preSum[0]=arr[0];
for(int i=1;i<n;i++){
preSum[i]=preSum[i-1]+arr[i];
}
}
public static int rangeSum2(int l,int r){
return l==0?preSum[r] :preSum[r]-preSum[l-1];
}
public static void main(String[] args) {
int arr[]={1,2,3,4,5};
int l=0,r=4;
int ans;
rangeSum(arr);
ans=rangeSum2(l,r);
System.out.print(ans);
}
}