滑动窗口算法-获取最大的窗口中的值之和 有更新!

  |   0 评论   |   1,542 浏览

    找到一个经典的问题:

    (一)给定一组大小为n的整数数组,计算长度为k的子数组和的最大值。

    比如

    数组为:1,2,3,4

    最大值为:3+4=7

    数组为:-1,4,7,-3,8,5,-2,6

    最大值为:7-3+8=12

    计算求和时,采取了滑动窗口技术(思路),通过一减一加求和,消除了内部的循环。

    	/**
         * 窗口向右滑动,通过减失效值加最新值求和并比较
         * 单层循环 O(n)
         */
        public static void calByLeapWinow(int[] array, int k) {
            if (array.length == 0 || k <= 0 || k > array.length) {// 非法参数不处理
                return;
            }
    
            int index = 0;// 记录最大子数组第1个元素的索引,目前是0
            int maxSum = 0;// 记录最大子数组和,目前是从左开始第1个子数组
            for (int i = 0; i < k; i++) {
                maxSum += array[i];
            }
    
            int curWindowSum = maxSum;
            for (int i = 1; i <= array.length - k; i++) {// 从下个元素开始,即窗口向右滑动
                curWindowSum = curWindowSum - array[i - 1] + array[k + i - 1];// 减去失效值,加上最新值
                if (curWindowSum > maxSum) {// 如果大于最大和,则记录
                    maxSum = curWindowSum;
                    index = i;
                }
            }
    
            /**打印结果*/
            System.out.print(maxSum + " // ");// 打印最大和
            System.out.print(array[index]);// 先打印第1个值,记录最大子数组第1个元素的值
            for (int i = 1; i < k; i++) {
                int value = array[i + index];
                System.out.print(value >= 0 ? ("+" + value) : value);// 非负数前面打印+号
            }
            System.out.println();
        }
    

    参考:
    https://blog.csdn.net/sty945/article/details/79846516

    评论

    发表评论

    validate