O(nlog(n))中的下一个更大的最小元素

时间:2018-10-03 22:43:36

标签: arrays algorithm

到目前为止,已经花了几个小时,但仍然很挣扎。我可以在O(n ^ 2)轻松地做到这一点,但挑战是要在O(nlog(n))时间内做到。

  1. 未排序数组

  2. 需要找到最小值A[j]的索引,以便对未排序数组中的每个元素分别使用A[j] > A[i]j > i

因此,本质上说,最小的元素大于数组中位于元素右侧的元素。

如果找不到元素,则索引为-1。

结果是我们要寻找的相应索引值的数组。

示例:

Input: [80; 19; 49; 45; 65; 71; 76; 28; 68; 66]
Output: [-1; 7; 4; 4; 9; 6; -1; 9; -1; -1]

当前尝试是遍历Input数组并为每个元素创建一个Value-Index Pair,将它们插入新数组,然后对这些值进行排序。然后可能是Binary Search或自平衡BST的某种变体,但是实际的解决方案却不在我脑海中。

这是“下一个更大元素”问题的细微变化。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为这个问题与寻找节点的后继者非常相似。如果您可以想象数组中的所有值都在BalancedBST内,例如AVL树。 这里唯一的技巧是,我们需要从数组中数字右侧的值中查找后继者。因此,这里的技巧是实际从右向左查询。

因此,我们从数组的最后一个元素开始,将其放入BST中,然后查询该元素的后继元素。继续对数组中从右到左的每个元素执行此操作。

在最坏的情况下,这将导致插入O(NlgN)以及在BST中找到后继者是logN。