求一个数组的最长递减子序列

<PRE class=cpp name="code">#include<iostream>
#include<cassert>
#include<stack>
using namespace std ;
int BiSearch(int *A,int nTarget,int nLen);
void FindLongestSequence(int *A,int nLen)
{
 int *index=new int[nLen];
 int *LDS=new int[nLen];
 index[0]=A[0];
 LDS[0]=1;
 int indexLen=1;
 for (int i=1;i<nLen;i++)
 {
  int pos=BiSearch(index,A[i],indexLen);
  index[pos]=A[i];
  LDS[i]=pos+1;
  if(pos>=indexLen)
   indexLen++;
 }
 int ResultLen=indexLen;
 for (i=nLen;i>=0;i--)
 {
  if(LDS[i]==ResultLen)
  { 
   index[ResultLen-1]=A[i];
   ResultLen--;
  }  
 }

 for (i=0;i<indexLen;i++)
 {
  cout<<index[i]<<" ";
 }
 delete []index;

}
int BiSearch(int *A,int nTarget,int nLen)
{
 assert(A!=NULL&&nLen>0);
 int start=0;
 int end=nLen-1;
 while (start<=end)
 {
  int mid=(start+end)/2;
  if(nTarget>A[mid])
   end=mid-1;
  else if(nTarget<A[mid])
   start=mid+1;
  else
   return mid;
 }
 return start;
}
int main()
{
 int A[]={9,4,3,2,5,4,3,2,77,76};
 int nLen=sizeof(A)/sizeof(int);
 FindLongestSequence(A,nLen);
 return 1;
}
</PRE><BR>
<BR>
<PRE></PRE>
<BR>
参考:http://apps.hi.baidu.com/share/detail/31988401

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值