给定编号为1,2,3,…,n的塔,其高度(n
的高度)和编号k。
两座a、b楼被认为是朋友,如果:
A-B=K
H[A]==H[B]
最大值(h[a+1],h[a+2]h[b-1])有多少“友谊”?
解决方案是直截了当的:
for i = 1, 2, 3, 4, 5, ..., n - k:
if h[i] == h[i+k]:
for j in range[i, i+k] :
MAX = max(MAX, h[j]
if MAX <= h[i]:
ans++
但我想要最有效的解决方法。请帮忙。
对于一个大的
h[i] = towers[i]
,程序会吃掉RAM;为了减少RAM,我用队列代替数组来增加塔的高度(当q.size()=k时,仅q.pop())用一个大k和天真的解决方案检查第三个条件必须花费时间。 最佳答案
可以使用deque提供o(n)算法。
每一步:
Remove too old elements from the deque head
(if currentindex - index >= k)
Remove elements from tail that have no chance to become maximum
in the k-size window (those < currentvalue)
Add new element (index) to the deque tail
这会将k大小窗口中max元素的索引保留在deque的头部,因此您可以确定-两个塔之间是否存在较大的值
用伪码表示(滑动最小)算法:
Can min/max of moving window achieve in O(N)?
关于algorithm - 获取“ friend ”塔的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22854623/