【发布时间】:2019-04-05 06:37:15
【问题描述】:
问题是find the maximum in each subarray of size k in an array of length n。
蛮力方法是 O(nk)。但是使用双端队列,解决方案应该是 O(n)。但是我不相信它会达到 O(n),特别是因为这个 while 循环:
# Remove all elements smaller than
# the currently being added element
# (Remove useless elements)
while Qi and arr[i] >= arr[Qi[-1]] :
Qi.pop()
在从 k 到 n 的 for 循环内。这在技术上不能每个循环最多运行 k 次,给出介于 O(n) 和 O(kn) 之间的某个位置吗?即使对于双端队列解决方案,最坏情况的时间复杂度实际上是 O(kn) 吗?
【问题讨论】:
-
我在这篇文章的底部回答了你的问题:stackoverflow.com/questions/39885520/…
-
每个元素被添加然后从队列中移除,并且不再出现,因此内部循环的总步数最多为2*n。
标签: algorithm performance big-o