本文给出两种求解最长上升子序列(LIS)的思路。
d[i]=max{d[j]+1},其中1<=j<i且a[j]<a[i]。
算法时间复杂度为O(n^2)。
设c[k]表示最长递增子序列长度为k时最小a[i]值。
算法主要实现过程:
1. 设当前已经求出的最长上升子序列的长度为len(初始为1),每次读取下一个新元素x;
思路1:
设d[i]表示以a[i]为结尾的最长递增子序列的长度,d[i]=max{d[j]+1},其中1<=j<i且a[j]<a[i]。
算法时间复杂度为O(n^2)。
思路2:
考虑输入数组中的两个数a[i]和a[j],i<j,a[i]<a[j]且d[i]=d[j],选择构造最优解时,应该选择a[i]。设c[k]表示最长递增子序列长度为k时最小a[i]值。
算法主要实现过程:
1. 设当前已经求出的最长上升子序列的长度为len(初始为1),每次读取下一个新元素x;
2. 若x>c[len],则直接加入到c的末尾,且len++。否则,在c中二分查找,找到最后一个
比x小的数c[k],使c[k+1]=x。
算法时间复杂度为O(nlgn)。