方法:数组
对于某个序列,设一个数组,将序列第一个数放入,而后再一个一个判断序列下一位,若是大于当前数组的末尾元素,则加入数组,不然利用二分法找到第一个大于等于当前数的元素并替换,最后这个数组的长度len就是最长上升子序列的长度。spa
正常DP求LIS的复杂度是O(n^2),若是面对很是大量的数据的回收怎么办呢?这时候就能够用到这种求法(可是这中求法只能求出个数而不能求出正确的子序列)排序
这种求法实际上已经不是DP了,比较像贪心,数组表明的是“可能性”,每次替换都是将“可能性”增大,可是最后结果其实并非最长上升子序列。引用
引用一个别人的例子:方法
有如下序列A[]=3 1 2 6 4 5 10 7,求LIS长度。数据
咱们定义一个B[i]来储存可能的排序序列,len为LIS长度。咱们依次把A[i]有序地放进B[i]里。(为了方便,i的范围就从1~n表示第i个数)co
A[1]=3,把3放进B[1],此时B[1]=3,此时len=1,最小末尾是3
A[2]=1,由于1比3小,因此能够把B[1]中的3替换为1,此时B[1]=1,此时len=1,最小末尾是1
A[3]=2,2大于1,就把2放进B[2]=2,此时B[]={1,2},len=2
同理,A[4]=6,把6放进B[3]=6,B[]={1,2,6},len=3
A[5]=4,4在2和6之间,比6小,能够把B[3]替换为4,B[]={1,2,4},len=3
A[6]=5,B[4]=5,B[]={1,2,4,5},len=4
A[7]=10,B[5]=10,B[]={1,2,4,5,10},len=5
A[8]=7,7在5和10之间,比10小,能够把B[5]替换为7,B[]={1,2,4,5,7},len=5