考虑一个具有N
个整数的数组。现在我们获得了一个索引i
,它可以占用1
到N
的值。该特定索引应始终存在于我们生成的LIS中。计算i
处每个值的LIS。
我们如何有效地解决上述问题?我直截了当的解决方案是改变其所有值的索引i
并计算LIS。时间复杂度达到O(N 2 log(N))。可以打败吗?
示例:
N = 2.i = 1
假设给定的数组是[1,2]。
[1,2]
或[2, 2]
每种情况下最长(严格)增加的子序列是2
和1
。
答案 0 :(得分:1)
LIS的规范动态程序为每个k
计算索引1..k
处元素的最长增长子序列,其中包括索引k
处的元素。使用此数据和镜像数据获得k..n
最长的子序列,我们发现包含索引k
的LIS作为k
之前最长的联合,{{1}之后的最长联合}}
O(n log n)
答案 1 :(得分:0)
拥有一个必须在子序列中的索引i使得向左和向右看是一个容易的任务,看看你可以保持严格增加的距离。这最多只需要O(N)步。
直接解决方案现在只需对索引i处的所有N值重复此操作,这样可以总计O(N ^ 2)。
但请注意,在更改索引i处的值时,可以重复使用之前完成的计算。只需要检查序列是否可以在任何方向上扩展到i之外,如果是,你已经知道了多远(或者现在可以一次性地计算它)。
这使总努力降至O(N)。