📜  最长单调递增子序列大小(N log N):简单实现(1)

📅  最后修改于: 2023-12-03 14:55:22.882000             🧑  作者: Mango

最长单调递增子序列大小(N log N):简单实现

介绍

最长单调递增子序列(LIS,Longest Increasing Subsequence)问题是计算机算法中的一个经典问题,其是求一个给定序列的最长上升子序列的长度。

在本文中,我们将介绍一种简单有效的算法,用于计算最长单调递增子序列大小,时间复杂度为O(N log N),其中N为序列长度。

算法思路

算法的基本思路是维护一个数组d,其中d[i]表示所有长度为i的递增子序列中,最小的结尾数,然后依次考虑每个数,将其插入到d数组中。

具体来说,对于一个数x,用二分查找法在d数组中查询第一个大于等于它的位置p,然后将d[p]替换为x。如果p等于LIS的长度,则LIS的长度加一。

代码实现
def length_of_lis(nums):
    d = [float('inf')] * (len(nums) + 1)
    d[0] = float('-inf')
    length = 0
    for num in nums:
        left, right = 0, length
        while left <= right:
            mid = (left + right) // 2
            if d[mid] < num:
                left = mid + 1
            else:
                right = mid - 1
        d[left] = num
        length = max(length, left)
    return length
参考资料

[1]. 最长上升子序列