给定一个数组,对于每个元素,我需要找到给定元素右边的最小元素,该元素大于当前元素。
在数学上,
对于数组i
中的每个索引A
,我需要找到索引j
,以便
A[j] > A[i]
j > i
A[j] - A[i] is minimum
我需要为每个索引j
i
蛮力解决方案将是O(n^2)
,我希望能做得更好。我认为使用自平衡BST可以实现O(n log n)
解决方案,但这似乎相当复杂。此外,我需要一个O(n)
解决方案。
这个问题是否有O(n)
解决方案?是否有证据表明下限是O(n log n)
?
答案 0 :(得分:9)
证明O(nlogn)下限:(对于基于比较的算法)
让我们说我们有一个基于比较的算法,可以在O(n)中完成这个任务。这是针对每个指数,我们在其右边有更大的元素(比如R [i])。
类似地,我们可以在反向输入数组上运行此算法,然后反转结果。对于每个索引,我们在其左边有更大的元素(比如L [i])。
这意味着在O(n)中我们对每个元素都有,数组中的直接更大元素= min(R [i],L [i])。
我们现在可以使用此信息对数组进行排序。
找到数组中的最小元素。找到它的继承者(直接更大的元素),然后是它的继任者等等。因此,您将按排序顺序获得整个数组。
仅使用比较(矛盾)在O(n)中对数组进行排序。
O(nlogn)算法:
从阵列右侧开始构建平衡BST。节点将包含值和相应的索引。
然后对于遇到的每个新元素,将其插入BST将得到相应的最接近的较大索引/值。