【问题标题】:Find the Largest Contingous Sub Array using the Sliding Window Approach使用滑动窗口方法找到最大的连续子数组
【发布时间】:2020-11-11 16:48:33
【问题描述】:

我对一个滑动窗口问题有点困惑,问题陈述比较简单,给定一个参数k,其中k是窗口的大小,找到可能的最大和。

例如

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)]

谁能提供一个小案头检查/这里发生的事情的例子,将不胜感激

我的理解

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

我们将迭代直到索引为 2 的元素,我们得到 4+2+1,因此我们已经覆盖了一个有效的窗口大小,一旦完成,编译器将移动到 if 语句, 因为 i 显然小于或等于 k-1 我们将执行这个块。

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

提前为格式道歉,并感谢所有这些回答。

【问题讨论】:

  • 它在添加下一个连续子数组的最后一个值之前减去当前连续子数组的第一个值。因此,当您在 (4,2,1) 和 currentSum = 7 并即将移动到 (2,1,7) 时,它会从 currentSum 中删除 4 (arr[2-(3-1)] = arr[0]),然后再添加 7 (arr[3])
  • @E-SetPrimeEpsilon 有什么更新吗?
  • 是的,非常感谢,它更清晰了

标签: arrays algorithm optimization sliding-window


【解决方案1】:
if(i >= k - 1)

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

如上图所示,对于每个大小为k的下一个窗口,我们必须删除前一个窗口的第一个元素,这在currentSum -= arr[i - (k-1)];中完成

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 2013-09-13
    • 2012-12-30
    • 2010-09-17
    • 2017-09-03
    • 2023-01-31
    • 2013-02-06
    • 2020-04-29
    • 2022-11-17
    相关资源
    最近更新 更多