如何解决数组中的下一个更大元素[不是第一个下一个更大元素]到右边?

时间:2015-12-17 12:48:46

标签: arrays algorithm data-structures stack logic

以前有一些帖子可以解决这个问题,但是他们正在为第一个下一个更大元素向右提供解决方案,而不是向右下一个更大元素

假设输入数组为[4, 15, 2, 9, 20, 11, 13 ,16 ,3]

右侧输出的下一个更大元素是

4 -> 9 ,
15 -> 16 ,
2->3 ,
9->11 ,
20->-1 ,
11->13 ,
13->16 ,
16->-1 ,
3->-1 ,

第一个下一个更大的元素输出就像

4->15 ,
15->20 ,
2->9 ,
9->20 ,
20->-1
11->13
13-> 16
16-> -1
3-> -1

我希望你们能理解其中的差异。

几乎所有在线资源[据我所知]为第二种情况提供了解决方案。

我希望以乐观的方式为第一种情况提供解决方案[算法] [< O(n ^ 2)]

任何类型的数据结构都适合我。

先谢谢。

1 个答案:

答案 0 :(得分:3)

这被称为超越问题。它可以通过将项目按照顺序(即从最后到第一个)放入自平衡BST中来解决。在树中插入节点后,您可以通过查看其右子节的子树中的最小元素,或者(如果它没有正确的子节点)找到它的下一个更大的元素,下一个更大的元素是第一个该节点属于其左子树的祖先(第一个祖先大于插入的节点)。

复杂性:O(n log n)

有一种替代解决方案,使用类似于合并排序的am算法。

请参阅here