【发布时间】:2016-02-08 08:36:33
【问题描述】:
最近我遇到了一个问题。算法部分需要计算长度为K的滑动窗口的最大元素之和。其中 K 的范围为 1(数组的 N 长度)。
例如,如果我有一个数组 A 作为5,3,12,4
长度为 1 的滑动窗口:5 + 3 + 12 + 4 = 24
长度为 2 的滑动窗口:5 + 12 + 12 = 29
长度为 3 的滑动窗口:12 + 12 = 24
长度为 4 的滑动窗口:12Final answer is 24,29,24,12.
我试过这个O(N^2)。对于每个长度为 K 的滑动窗口,我可以计算 O(N) 中的最大值。由于 K 最大为 N。因此,整体复杂度为 O(N^2)。
我正在寻找 O(N) 或 O(NlogN) 或类似于此算法的东西,因为 N 可能高达 10^5。
注意:数组中的元素可以大到10^9,所以输出最终答案为模10^9 +7
编辑:我真正想在整个线性时间或 O(NlogN) 中而不是 O(KN) 中找到每个 K 值(即从 0 到 N)的答案) 或 O(KNlogN) 其中 K={1,2,3,.... N}
【问题讨论】:
-
为什么我的问题中有反对票。请说出原因以便我修改问题
-
不确定具体情况,但这似乎与一些数学技巧有关。让我们看看项目
A[i]=x。我们查看窗口1..K的size的所有值。当size=1时,x为最大值。当size增长时,x可能不再是最大值。一旦它不是最大值(比如size=m),它将不再是最大值。我认为这是解决方案的关键部分。 -
直觉上这似乎很难:令人惊讶的是,对于特定的 K 可以完成 O(N) 并且需要将 K 硬编码到数据结构中。为所有 K 做 O(N) 似乎非常具有挑战性。另一方面,如果我们可以利用相邻 K 的一些共性,那么 O(NlogN) 可能是可能的吗?
-
@shapiro yaacov 如果给定的数组是升序还是降序呢?那么最坏的情况是O(N ^ 2)。如果你有更好的复杂性,那么请写下这篇文章的答案。
-
@strubbly - 我认为你所说的 如果我们可以利用相邻 K 的一些共性,那么...... 接近我的意思。在查看单个项目及其周围环境时,我们会获得一些关于数组的知识......
标签: algorithm