最长单调递减子序列 采用二分搜索算法,时间复杂度O(nlgn)。

来源:互联网 发布:狮王红包软件 编辑:程序博客网 时间:2024/05/22 08:03

int LIS(int a[], int n)
{
 int i=0, k;
 int l, h;
 int *b=new int[n+1];
 b[1]=a[0];
 for(i=1, k=1; i<n; i++)
 {
  if(a[i]<b[k])
   b[++k]=a[i];
  else
  {//更新b[]
   if(a[i]>b[1])
    b[1]=a[i];
   else
   {//二分查找
    for(l=1, h=k; l!=h-1; )
    {
     int mid=(l+h)/2;
     if(b[mid]<=a[i])
      h=mid;
     else
      l=mid;
    }
    b[h]=a[i];
   }
  }
 }

 return k;
}

int main()
{
 int a[]={9,4,3,2,5,4,3,2};
 cout<<LIS(a, 8)<<endl;
 
}

原创粉丝点击