您的位置:首页 > 其它

最长上升子序列问题(LIS)

2016-07-06 16:44 323 查看
本文给出两种求解最长上升子序列(LIS)的思路。

思路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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: