前缀和数组

问题:如何求得一维数组从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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值