定义

前缀和算法:一种用于高效计算数组前缀和的算法。前缀和是指数组中某个位置之前(包括该位置)所有元素的和。基本思想是通过一次遍历数组,计算每个位置的前缀和,并将其存储在一个新的数组中。然后,可以通过查询新数组中的元素,快速计算出任意子数组的和。

例如有个数组arr的长度为6,这个时候就可以通过遍历一次数组,计算每个位置的前缀和得到数组pre,此时
pre数组0位置的值为:arr数组0-0位置的值
pre数组1位置的值为:arr数组0-1位置的值
pre数组2位置的值为:arr数组0-2位置的值
……
以此类推
这个时候如果有个需求,需要计算arr数组中L位置到R位置的值的和,这个时候可以通过一下方式得到:
如果L=0,则这个值为pre[R]的值
如果L≠0,则这个值为pre[R]-pre[L-1]的值

代码示例

public class PreSum {

    public static void main(String[] args) {
        int[] arr = {5, 1, 6, 11, 10, 9, 45, 1, 6, 7, 9, 12};
        int[] pre = getPre(arr);
        int sum = arrSum(pre, 1, 5);
        System.out.print("原始数组为:");
        printArr(arr);
        System.out.print("前缀和数组为:");
        printArr(pre);
        System.out.println("原始数组1-5位置的和为:" + sum);
    }

    public static int arrSum(int[] pre, int l, int r) {
        if (l == 0) {
            return pre[r];
        } else {
            return pre[r] - pre[l - 1];
        }
    }

    public static void printArr(int[] arr) {
        for (int j : arr) {
            System.out.print(j + " ");
        }
        System.out.println();
    }

    /**
     * 获取前缀和数组
     * @param arr   数组
     * @return      前缀和数组
     */
    public static int[] getPre(int[] arr) {
        int[] pre = new int[arr.length];
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            pre[i] = sum;
        }
        return pre;
    }

}

打印结果为:

原始数组为:5 1 6 11 10 9 45 1 6 7 9 12 
前缀和数组为:5 6 12 23 33 42 87 88 94 101 110 122 
原始数组1-5位置的和为:37
最后修改:2024 年 01 月 24 日
如果觉得我的文章对你有用,请随意赞赏