给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数n(≤105);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。
输入样例:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
结尾无空行
输出样例:
3 4 6 8
结尾无空行
代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,j = 1,a[100000],b[100000],c[100000],k = 0,max,y;
scanf("%d",&n);
for(i = 0;i<n;i++)
{
scanf("%d",&a[i]);
}
if(n==1) printf("%d",a[0]);//只输入一个数时,直接输出
else {
for(i = 0;i<n-1;i++)
{
if(a[i]<a[i+1])
{
j++;
}
else
{
b[k] = j;//b存储的是递增数的个数
c[k] = i;//c存储的是递增数的结束位置
k++;
j=1;
}
}
//最后一个数的处理
b[k] = j;
c[k] = i;
if(k==0||k==n-1)//顺序或逆序时
{
if(j==1) printf("%d",a[0]);//逆序时,输出第一个数
else {//顺序时按顺序输出即可
for(i = 0;i<n;i++)
{
if(i==n-1) printf("%d",a[i]);
else printf("%d ",a[i]);
}
}
}
else {
max = b[0],y = 0;
for(i = 1;i<=k;i++)
{
if(b[i]>max)
{
max = b[i];
y = i;
}
}
for(i =c[y]-b[y]+1;i<=c[y];i++)
{
if(i==c[y]) printf("%d",a[i]);
else printf("%d ",a[i]);
}
}
}
return 0;
}