【发布时间】:2011-10-27 07:30:30
【问题描述】:
给定一个包含 n 个元素的数组和一个整数 k。假设我们想在数组中滑动一个长度为 k 的窗口,报告每个窗口中包含的最大值。例如,给定数组
15 10 9 16 20 14 13
给定一个长度为 4 的窗口,我们将输出
[15 10 9 16] 20 14 13 ---> Output 16
15 [10 9 16 20] 14 13 ---> Output 20
15 10 [ 9 16 20 14] 13 ---> Output 20
15 10 9 [16 20 14 13] ---> Output 20
所以结果是
16 20 20 20
我通过在每个点跟踪窗口的最大元素来解决问题,但是当最大元素滑出窗口时遇到了问题。那时,我想不出一个快速的方法来找出最大的剩余元素是什么。
有人知道解决这个问题的有效算法吗?
【问题讨论】:
-
现在的问题是,您对此有何想法?
-
@Als:我整个晚上都在想它,我就像一个正在移动的子数组长度的窗口一样接近,我们需要从中找到最大值。它工作得非常好。然后我陷入了当前最大元素超出“滑动窗口”的问题。那时我需要存储滑动窗口的所有当前元素。 :(
-
mohan:请随意在 Q 中表达您的想法,它会告诉读者,您尝试过什么,否则他们只会觉得您只是在这里问 Q。
-
提示:动态编程 (en.wikipedia.org/wiki/Dynamic_programming) 我认为可以让您解决 O(M*N) 中的问题,其中 M 是数组的长度,N 是数组中的元素数。
-
@Matthieu:O(MN) 不是“朴素”算法的复杂性,即简单的 2D 循环吗?