滑动窗口算法(查找相加的最大连续数)

时间:2019-02-13 13:43:38

标签: java queue sliding-window

public class Main {
    static final int k = 0;

    public static void main(String[] args) {
        int[] arr = {1, -1, -3, 3, 7, -7, -1, -1, 10, 2};

        int startIndex = 0, endIndex = 0, currentSum = 0;
        int maxDigitsUsed = Integer.MIN_VALUE;


        while(endIndex < arr.length - 1){
            currentSum += arr[endIndex];
            if (currentSum == k && maxDigitsUsed < endIndex - startIndex) {
                maxDigitsUsed = endIndex - startIndex;
            } else {
                endIndex++;
            }
        }


        // moving the startIndex forward when there is a chance to change the sum to k
        while (startIndex <= endIndex) {
            currentSum -= arr[startIndex];
            if (currentSum == k && maxDigitsUsed < endIndex - startIndex) {
                maxDigitsUsed = endIndex - startIndex;

            }
            startIndex++;

        }
 }

我的教授经历了一个简单的滑动窗口算法,该算法检查最大连续数字加起来等于指定的总和k,在这种情况下,k = 0。

但是,当出现负数时,它似乎不起作用。为什么会这样,我应该如何纠正呢?另外,最初的实现被假定为一个队列,因此任何基于队列的答案都将非常有帮助!

此基于数组的实现仅是我的尝试,因此请原谅任何严重错误。最初的问题仅涉及正整数,并使用队列而不是数组。

1 个答案:

答案 0 :(得分:0)

我还没有对此进行深入研究,但是我可以告诉您,您的代码无法完成您想要的。滑动窗口的方式实际上无法找到所有连续数字的可能组合。

您的代码看起来像在做什么操作,就是将结束索引向前滑动,直到达到所需的总和或到达数组的末尾为止。然后,以相同的限制向前滑动起始索引。因此,最终得到的是一个执行此操作的窗口:

[o - - - -]
[o o - - -]
[o - o - -]
[o - - o -]
[o - - - o]
[- o - - o]
[- - o - o]
[- - - o o]
[- - - - o]

请注意,您的窗口永远不会像这样:

[- o - o -]

因此,如果恰好是最大的窗口,加起来可以达到所需的总和,那么您的算法将永远找不到它。因此,您需要努力使代码进入所有可能的窗口。最明显的方法是使用嵌套循环。您可以将结束索引一直滑到末尾,然后将开始索引向上加一,重置总和,然后将结束索引从新的起点再滑动到末尾。对所有可能的起始索引重复此操作,并且应覆盖数组上的每个窗口。