最长递增子序列(LIS)
时间复杂度nlogn,空间复杂度n
lmin[k]表示前i个元素中长度为k的所有递增子序列的最后一个元素的最小值。
#include<stdio.h>
#define N 10 int lmin[10]; //找到==或者大于e的第一个数的位置 int bsearch(int a[],int p,int r,int e) { int m; while(p<=r) { m=(p+r)>>1; if(a[m]>e)r=m-1; else if(a[m]<e)p=m+1; else return m; } return p;//返回大于的第一个数位置 //return r;//应该是第一个小于 } void lis(int a[],int lm[]) { int i,j; int mlen=0; lm[0]=a[0]; for(i=0;i<N;i++) { if(a[i]>lm[mlen]) { mlen++; lm[mlen]=a[i]; } else { j=bsearch(lm,0,mlen,a[i]); lm[j]=a[i]; } } printf("%d \n",mlen+1); } int main() { int a[10]={2,1,6,2,3,4,7,9,6,7}; //int a[10]={2,5,6,7,10,14,17,24,26,29}; //printf("%d ",a[bsearch(a,0,9,10)]); lis(a,lmin); }