赞
踩
本篇主要讲解,前缀和求值的算法,说白了其实就是求一个数组左右范围内的数据求和。
举个例子:当前数组为[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算法,主要用于快速计算范围区间的数值,小伙伴可以参考代码进行演练测试,代码中对数据的大小和边界异常都进行了处理,欢迎讨论指教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。