代码如下:
// FindLongestSequence.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#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 (int i=nLen;i>=0;i--)//记录最长递减子序列
{
if(LDS[i]==ResultLen)
{
index[ResultLen-1]=A[i];
ResultLen--;
}
}
for (int 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[]={3,2,1,8,7,6,5,4};//递减
int nLen=sizeof(A)/sizeof(int);
FindLongestSequence(A,nLen);
system("pause");
return 1;
}
![](https://img-my.csdn.net/uploads/201209/03/1346676839_2049.jpg)