查找序列中每个元素的前导

时间:2013-02-15 10:20:52

标签: algorithm language-agnostic

给定序列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)中轻松完成,但有没有更有效的方法呢?

1 个答案:

答案 0 :(得分:3)

可以使用stackO(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中的最后一个元素将始终是我们正在寻找的。

由于嵌套循环,线性复杂性可能不会立即明显,但请注意每个元素最多只能离开并进入堆栈一次,因此是常数次。