【问题标题】:How to check whether each element is in any Longest Increasing Subsequence of an array or not?如何检查每个元素是否在数组的任何最长递增子序列中?
【发布时间】:2017-12-17 11:36:26
【问题描述】:

我们有一个整数数组。对于每个元素,我们想知道该元素是否至少包含在我们数组的许多 LIS 中的一个 LIS 中。我们想在 O(n2) 内知道数组中所有元素的这一点。

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

我知道一个使用 dfs 的简单解决方案,但它的运行时间是 O(n2)

【问题讨论】:

标签: arrays algorithm time-complexity lis


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2011-01-10
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多