给出一个整数向量,我需要找出向量中是否存在a, b, c
和a < b< c
这样的三个元素v[a] < v[c] < v[b]
。
到目前为止,我的处理方法如下。首先,我忘记了a,并针对向量中的每个数字找到位于该元素左侧的v [i]的最小值。我将此信息存储在另一个数组中。然后,我应用mergesort,当我到达两个元素相交的点时,我测试右边的元素是否可以是c,左边的元素可以是b。但是,我还需要测试与正确元素相交的其他元素是否可以是b,这会增加过多的时间复杂度。我需要它最多是线性的。 可以给我提示如何进行吗?
编辑:原谅我,标题之前没有确定。我需要的是a
EDIT2 : 限制 :除矢量外,我无法使用数据结构。而且算法必须基于 分而治之方法 。
答案 0 :(得分:4)
您可以在 O ( n )时间内完成此操作,最坏情况下的 O ( n )通过在数组上迭代同时保留最大禁止范围(v[a]
,v[c]
)的堆栈(LIFO数据结构)来节省空间。堆栈的最高元素是从到目前为止看到的最小值到此最小值之后看到的最大值的范围。 (或者,出于实现原因,您可能会发现将该范围保留在一个单独的变量中,并且仅将堆栈用于 old 禁区。)
处理任何单个元素可能需要最多 O ( n )时间(如果必须将整个堆栈展开到最前面的范围),但是此成本必须摊销,因此处理整个数组仍仅需要 O ( n )时间(因为处理元素将展开整个堆栈的唯一原因是如果将所有禁止范围统一为一个更大的范围,则无需重新添加它弹出的所有范围,因此只需一次完成工作)