7-2 最长连续递增子序列
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(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>
struct list{
int da; //存输入的数据
int t; //存可以递增几个
}a[100001];
int main()
{
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&a[i].da);
a[i].t=1;
}
for(int i=0;i<m;i++)
{
for(int j=i+1;j<m;j++)
{
if(a[j].da>a[j-1].da)
a[i].t++;
else
break;
}
}
int max=0;
int f;
for(int i=0;i<m;i++)
{
if(a[i].t>max)
{
max=a[i].t;
f=i;
}
}
printf("%d",a[f].da);
for(int i=f+1;i<f+max;i++)
printf(" %d",a[i].da);
}
第二种较为麻烦 用了几个数组进行比较存储
#include<stdio.h>
int a[100001];
int b[100001];
int c[100001];
int main()
{
int m,i,j;
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&a[i]);
int t1=0;
int t2=0;
int x=-1;
i=0;
int max=0;
while(i<m)
{
if(i==0)
{
for(i=0;i<m;i++)
{
if(a[i]>x)
{
b[t1++]=a[i];
x=a[i];
}
else
{
x=-1;
break;
}
}
}
else{
for(i;i<m;i++)
{
if(a[i]>x)
{
c[t2++]=a[i];
x=a[i];
}
else
{
x=-1;
break;
}
}
}
if(t1>=t2)
max=t1;
else
max=t2;
if(max==t1)
t2=0;
else
{
for(t1=0;t1<max;t1++)
{
b[t1]=c[t1];
}
t2=0;
}
}
printf("%d",b[0]);
for(i=1;i<max;i++)
printf(" %d",b[i]);
}