【发布时间】:2015-06-15 14:51:13
【问题描述】:
我已经用谷歌搜索并找到了解决方案,
void maxSlidingWindow(int A[], int n, int w, int B[]) {
deque<int> Q;
for (int i = 0; i < w; i++) {
while (!Q.empty() && A[i] >= A[Q.back()])
Q.pop_back();
Q.push_back(i);
}
for (int i = w; i < n; i++) {
B[i-w] = A[Q.front()];
while (!Q.empty() && A[i] >= A[Q.back()])
Q.pop_back();
while (!Q.empty() && Q.front() <= i-w)
Q.pop_front();
Q.push_back(i);
}
B[n-w] = A[Q.front()];
}
但我无法得到这个解决方案。例如,如果您以 {10,5,3,2} 在第一个 for 循环之后,Dequeue 将是这样的,3(rear)->5->10(head)。 当这涉及到第二个 for 循环时 10 保存在 B[0] 中。 , 清单会是这样的, 2(后)-> 3 -> 5 -> 10(头)。
但是,这里的“5”应该在前面。有人可以用一个例子来解释这段代码。
【问题讨论】:
-
我没有试图理解代码的问题,但我可以告诉你,这个问题可以很容易地在线性时间和常数空间中解决:只需加起来前 k 个数字,然后在剩余的数组位置 A[i] 中扫描 k+1
-
解决办法是找出子数组的最大值,而不是子数组的最大和。
-
什么是“子数组的最大值”?子数组是一堆数字,所以我不明白你怎么说一个子数组大于另一个子数组,除非你从每个子数组中计算一些东西(比如总和)。
-
给定数组是{10,5,3,2},子数组大小是3(K=3)。那么子数组将是 {10,5,3} 和 {5,3,2},如果 K = 2,则 {10,5}{5,3}{3,2}
-
对,但是这 3 个子数组中的哪一个是“最大”的? (我的意思是:如果不是元素的总和,标准是什么?)
标签: algorithm data-structures queue