我将演示如何使用列表中做到这一点:
L = [21, 17, 16, 7, 3, 9, 11, 18, 19, 5, 10, 23, 20, 15, 4, 14, 1, 2, 22, 13, 8, 12, 6]
长度为N=23
和W = 4
。
让你列表的两个新副本:
L1 = [21, 17, 16, 7, 3, 9, 11, 18, 19, 5, 10, 23, 20, 15, 4, 14, 1, 2, 22, 13, 8, 12, 6]
L2 = [21, 17, 16, 7, 3, 9, 11, 18, 19, 5, 10, 23, 20, 15, 4, 14, 1, 2, 22, 13, 8, 12, 6]
环路从i=0
到N-1
。如果i
不能被W
整除,则用max(L1[i],L1[i-1])
替换L1[i]
。
L1 = [21, 21, 21, 21, | 3, 9, 11, 18, | 19, 19, 19, 23 | 20, 20, 20, 20 | 1, 2, 22, 22 | 8, 12, 12]
环路从i=N-2
到0
。如果i+1
不能被W
整除,则将L2[i]
替换为max(L2[i], L2[i+1])
。
L2 = [21, 17, 16, 7 | 18, 18, 18, 18 | 23, 23, 23, 23 | 20, 15, 14, 14 | 22, 22, 22, 13 | 12, 12, 6]
制作长度N + 1 - W
列表L3
,使L3[i] = max(L2[i]
,L1[i + W - 1])
L3 = [21, 17, 16, 11 | 18, 19, 19, 19 | 23, 23, 23, 23 | 20, 15, 14, 22 | 22, 22, 22, 13]
然后这个名单L3
是你所寻求的移动最大值,L2[i]
是i
和未来之间的最大范围垂直线,而l1[i + W - 1]
是垂直线和i + W - 1
之间的最大范围。
这么好,我不得不赞同这个答案和你引用的答案! – Andy 2012-01-18 05:31:12
我必须在这里评论说,双栈队列实现不一定是最好的。我试过了,对于一个实时应用程序,结果是灾难性的......根据应用程序,人们也可以尝试deque(双端队列)结构,它也会给出O(N)结果,但不一定为O(1)摊销操作。我在数组上实现了一个循环deque,它运行良好。看看这个问题以及:https://stackoverflow.com/questions/12329073/find-the-min-number-in-all-contiguous-subarrays-of-size-l-of-a-array-of-size -n。 – Alan 2017-09-18 00:41:05