gpt4 book ai didi

algorithm - 获取 "friend"塔的编号

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:08:03 24 4
gpt4 key购买 nike

给定编号为 1、2、3、...、n 的 n 塔及其高度(h[i] = towers[i] 的高度)和一个数字k。

两座塔a,b被认为是 friend 当且仅当:

  • a - b = k
  • h[a] == h[b]
  • 最大(h[a+1], h[a+2] ... h[b - 1]) <= h[a]

有多少“友谊”?

解决方案很简单:

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++

但我想要以最有效的方式解决问题。请帮忙。

对于较大的n,程序会占用内存;为了减少它,我使用队列而不是数组来添加塔的高度(当 q.size() == k, Just 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 大小窗口中的最大元素的索引保留在双端队列的头部,因此您可以确定 - 两个塔之间是否有更大的值

用伪代码描述(滑动最小值)算法: Can min/max of moving window achieve in O(N)?

关于algorithm - 获取 "friend"塔的编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com