如何检查每个元素是否在数组的任何最长增加子序列中?

时间:2017-07-12 21:34:26

标签: arrays algorithm time-complexity lis

我们有一个整数数组。我们想知道每个元素是否至少包含在我们数组的许多LIS的LIS中。我们想知道数组中所有元素的数据都小于 O(n 2

例如,数组[2,4,3,2,5]有两个LIS。数组中的所有元素都属于这些LIS中的至少一个,除了不属于任何LIS的 4 th 元素。

我知道一个使用dfs的简单解决方案,但其运行时为 O(n 2

1 个答案:

答案 0 :(得分:0)

运行诸如https://en.wikipedia.org/wiki/Longest_increasing_subsequence#Efficient_algorithms之类的算法,该算法在每个点计算在该点结束的最长增长子序列的长度。

使用相反的数据运行相同的算法,为每个点计算从该点开始的最长增长子序列的长度。

对于每个点,添加两个计算长度。如果此总和等于找到的最大总和,则该点是最长的增加子序列。

引用的算法每次传递需要时间O(n log n),且总和仅为O(log n),因此总数为O(n log n)