【发布时间】:2014-05-16 06:49:45
【问题描述】:
给定n 塔,编号为 1、2、3、...、n,其高度(h[i] = towers[i] 的高度)和数字 k。
两塔a, b 被认为是朋友当且仅当:
- a - b = k
- h[a] == h[b]
- max(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++
但我希望以最有效的方式解决问题。请帮忙。
对于大的n,程序会吃掉内存;为了减少这种情况,我使用队列而不是数组来添加塔的高度(当 q.size() == k,Just q.pop() 时)。用天真的解决方案检查具有大 k 的第 3 个条件必须花费时间。
【问题讨论】:
-
您可以使用this question 的答案来有效地获得滑动最大值(问题是关于最小值,但这种变化很简单)。然后你可以在
O(n)时间解决这个问题。 -
“对于大的 n,程序会吃掉 RAM”:你能解释一下吗?该算法不使用额外的存储空间!并且使用双端队列并不会减少存储空间!
-
因为 n 与 k 相比非常大,所以如果我使用数组,我必须将所有数字存储到数组 -> 浪费
-
我解决了!感谢您的链接@Heuster