📅  最后修改于: 2023-12-03 14:55:22.882000             🧑  作者: Mango
最长单调递增子序列(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]. 最长上升子序列