如何检查每个元素是否在数组的任何最长递增子序列中?
How to check whether each element is in any Longest Increasing Subsequence of an array or not?
我们有一个整数数组。对于每个元素,我们想知道该元素是否至少包含在数组的许多 LIS 中的一个 LIS 中。我们想知道数组中所有元素的时间小于 O(n2).
例如数组 [2, 4, 3, 2, 5] 有两个 LIS。数组中的所有元素都至少属于这些 LIS 之一,除了不属于任何 LIS 的 4th 元素。
我知道一个使用 dfs 的简单解决方案,但它的运行时间是 O(n2).
运行 一种算法,例如 https://en.wikipedia.org/wiki/Longest_increasing_subsequence#Efficient_algorithms,它计算在每个点结束的最长递增子序列的长度。
运行 相同的算法使用相反顺序的数据,为每个点计算从该点开始的最长递增子序列的长度。
为每个点添加两个计算长度。如果此和等于找到的最大和,则该点位于最长递增子序列上。
引用的算法每次通过都需要时间 O(n log n),总和仅为 O(log n),因此总数为 O(n log n)
我们有一个整数数组。对于每个元素,我们想知道该元素是否至少包含在数组的许多 LIS 中的一个 LIS 中。我们想知道数组中所有元素的时间小于 O(n2).
例如数组 [2, 4, 3, 2, 5] 有两个 LIS。数组中的所有元素都至少属于这些 LIS 之一,除了不属于任何 LIS 的 4th 元素。
我知道一个使用 dfs 的简单解决方案,但它的运行时间是 O(n2).
运行 一种算法,例如 https://en.wikipedia.org/wiki/Longest_increasing_subsequence#Efficient_algorithms,它计算在每个点结束的最长递增子序列的长度。
运行 相同的算法使用相反顺序的数据,为每个点计算从该点开始的最长递增子序列的长度。
为每个点添加两个计算长度。如果此和等于找到的最大和,则该点位于最长递增子序列上。
引用的算法每次通过都需要时间 O(n log n),总和仅为 O(log n),因此总数为 O(n log n)