【发布时间】: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