使用滑动 Window 方法找到最大的连续子数组

Find the Largest Contingous Sub Array using the Sliding Window Approach

我对滑动 window 问题有点困惑,问题陈述相对简单,给定参数 k,其中 k 是 window 的大小,找到可能的最大总和。

例如

array[] = {4,2,1,7,8,1,2,7,1,0} k = 3,最大连续子数组为{7,8,1}等于到 16

我有代码,但是我有一行没看懂

 *public static int findMaxSumSubarray(int[] arr, int k)
{
 int currentSum = 0;
 int max = Integer.MIN_VALUE;
 for(int i = 0; i<arr.length;++i)
 {
     currentSum += arr[i];
    

     /*
     lets take an array example  let arr = {4,2,1,7,8,1,2,7,1,0}
     when i is at k-1 then we have effectively covered a valid subset, lets say
     k = 3, when i moves to  the third element which is 1, a valid subset has been 
     covered
      */
     
       if(i >= k - 1)
     {
          max = Math.max(max,currentSum);
          currentSum -= arr[i - (k-1)];
     }
 }
 return  max;
}**

我不太明白的那一行是currentSum -= arr[i-(k-1)]

有人可以提供一张小桌子吗check/example 将不胜感激

我的理解

让我们使用之前的数组 = {4,2,1,7,8,1,2,7,1,0}

我们将迭代直到索引 2 处的元素,我们得到 4+2+1,因此我们已经覆盖了一个有效的 window 大小,完成后,编译器将转到 if 语句, 由于 i 明显小于或等于 k-1 我们将执行此块。

currentSum -= arr[i - (k-1)]; 这里发生了什么?

提前对格式表示歉意,感谢所有这些回答。

if(i >= k - 1)

此检查是为了确保 sum 变量始终具有 k 个元素的总和。 如果 window 大小是 k,那么一切都很好。然后移动到下一个 i 时大小变为 k+1。现在,sum 具有 k+1 个元素的值,因此您从 sum 的最后一个 window 中删除 的第一个元素以使 sum 具有又是 k 个元素的总和。请参阅下图以更清楚地了解 k = 3

正如您在上图中看到的,对于大小为 k 的每个 下一个 window,我们必须删除前一个 window在 currentSum -= arr[i - (k-1)];

中完成的第一个元素