最长递增子序列(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);
}


浙公网安备 33010602011771号