java算法之前缀值求和

引言

本篇主要讲解,前缀和求值的算法,说白了其实就是求一个数组左右范围内的数据求和。

举个例子:当前数组为[1,2,3,4],那么前缀和为[1,3,6,10]

比如说一个数组{2,3,6,1,9,5,8}对[2,4]范围段的数据求和,这里2、4指的是下标。

前缀和的作用就是快速求一段区间的和,方便查询统计,提高速度。 

  • 算法思路 

 先对下标从0到末位下标的数据累加求和赋值给对应的数组位置,比如{2,4,5,8,3,9,7,4}求和之后是{2,5,11,12,21,26,34},如果求下标[2,4]范围的字段和就是求和后数组的下标4减去下标(2-1)就是对应范围的数据求和,该算法叫做前缀求和算法。

  • 代码演示
package com.czing.study.algorithm.code;

/**
 * @Description TODO
 * @Author wangchengzhi
 * @Date 2022/12/15 10:22
 */
public class PreSum {
    public static void main(String[] args) {
        int []  arry={2,3,6,1,9,5,8};
        preSum(arry,0,1);
    }



    /**
     * @Author wangchengzhi
     * @Description前缀和算法
     * 思路:
     *有一个数组[2,3,6,1,9,5,8]
     * 计算任意范围内的加和[arr,l,r]
     * 比如计算[2,6]
     * 先计算累计下标的加和
     * [2,5,11,12,21,26,34]
     * [2,6]范围的加和就是计算之后的集合下标arr[6]-arr[2-1]
     * [l,r]的范围加和就是计算之后的集合下标arr[r]-arr[l-1]
     * !!! l和r指的是左右下标,不是自然数那种
     * @Date 10:23 2022/12/15
     * @Param
     * @return
     **/
    public static void preSum(int[] arry,int left,int right){
        if(left<0||right>arry.length-1){
            throw new  RuntimeException("请确认左右范围是否超出数组本身长度范围!!!");
        }
        //先求对应集合的加和
        int sumPre[] = new int[arry.length];
        //加和的初始值为第一位
        sumPre[0]=arry[0];
        for(int pre=1;pre<arry.length;pre++){
            //每个下标的值为前面的加和加上后一位
            sumPre[pre] = sumPre[pre-1]+arry[pre];
        }
        System.out.print("加和之后的数据:");
        for(int i=0;i<arry.length;i++){
            System.out.print(sumPre[i] +" ");
        }
        //计算数组中left到right的范围求和
        int preSum = left==0 ? sumPre[0]:sumPre[right]-sumPre[left-1];
        System.out.printf("数组从"+left+"到"+right+"的范围加和是:");
        System.out.println(preSum);

    }

}

结言 

前缀和算法是基础的java算法,主要用于快速计算范围区间的数值,小伙伴可以参考代码进行演练测试,代码中对数据的大小和边界异常都进行了处理,欢迎讨论指教。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值