【问题标题】:Maximum Of all subarrays of size K, using double ended queue大小为 K 的所有子数组的最大值,使用双端队列
【发布时间】: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


【解决方案1】:

您似乎错过了这个条件:Q.front() &lt;= i-w 这会删除 too old 前面的项目。

你也可以看到我的cmetsin this answer

【讨论】:

  • while (!Q.empty() && Q.front()
  • 是的。此代码删除离开移动窗口的元素
  • 这个我看不懂,能解释一下吗?
  • 我特别不明白这个 "Q.front()
  • i-w 是仍在窗口中的最后一个元素的索引(最旧的)。是的,当 i-w=1 时,将弹出第 0 个元素
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 2017-08-15
  • 2015-08-14
  • 1970-01-01
  • 2022-12-20
  • 2016-02-11
  • 2016-06-13
  • 1970-01-01
相关资源
最近更新 更多