给定序列a[1], a[2], a[3] .... a[n]
,我必须为每个a[i]
找到一个元素a[j]
,其中a[j]
是序列a[i - 1], a[i - 2], a[i - 3]....
中的第一个元素a[j] < a[i]
。
换句话说,我必须找到a[j]
a[j] < a[i]
和1<=j<i
。但如果有多个这样的元素,我必须选择最接近a[i]
的那个。
例如,按以下顺序:
2 6 5 8
我必须为6和5输出2,为8输出5。
我知道这可以在O(n^2)
中轻松完成,但有没有更有效的方法呢?
答案 0 :(得分:3)
可以使用stack在O(n)
中完成。
a = your array
d = a stack
d.push(a[1])
for i = 2 to n do
while d.top > a[i] do
d.pop()
print d.top if it exists, else -1
d.push(a[i])
基本上,我们会对d
进行排序,并确保其最后一个元素始终小于a[i]
。这样,d
中的最后一个元素将始终是我们正在寻找的。 p>
由于嵌套循环,线性复杂性可能不会立即明显,但请注意每个元素最多只能离开并进入堆栈一次,因此是常数次。