问题: 例如(1,9,2,5,7,3,4,6,8,0)的最长连续递增子序列为(3,4,6,8).
思路: 用两个索引在序列中进行移动,并记录最大的长度和最大长度下的起始索引。需要特别注意的是走在最前面的索引移到了最后并且还是递增的特殊情况。
代码实现:
#include<iostream>
using namespace std;
int a[10]={1,9,2,5,7,3,4,6,8,0};//假设有10个数
int main()
{
int index0=0,index1=1;
int maxlen=0,j=0; //j用于记录最长子序列开始的角标
while(index1<10)
{
if(a[index1]<=a[index1-1]||(index1==9&&a[index1]>a[index1-1]))//如果不是递增或者index1移到了最后并且还是递增
{
if(index1==9&&a[index1]>a[index1-1])//index1移到了最后并且还是递增
{
j=index0;
maxlen=index1-index0+1;
}
else
{
j=index0;
maxlen=index1-index0;
}
index0=index1; //重新选择起点
}
index1++;
}
//输出最长递增子序列
for(int i=j;i<j+maxlen;i++)
cout<<a[i]<<" ";
return 0;
}