方法:數組
對於某個序列,設一個數組,將序列第一個數放入,而後再一個一個判斷序列下一位,若是大於當前數組的末尾元素,則加入數組,不然利用二分法找到第一個大於等於當前數的元素並替換,最後這個數組的長度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