给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数n(≤10
5
);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。
输入样例:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
输出样例:
3 4 6 8
//思路:首先设置一个结构体,包含起始地址,以及长度两个参数,设置结构体数组
//从0开始遍历这个数组,同时比较前后两个数,并计数,如果有后数大于前数,计数停止,给结构体赋值
//结构体数组比较长度
#include<stdio.h>
#include<string.h>
typedef struct list{
int* elem;
int length;
int listsize;
} SqList;
typedef struct count{
int length;
int* s; //起始地址
} count1;
int main()
{
int i;
int d;
scanf("%d",&d);
SqList p;
p.length=d;
p.elem=(int*)malloc((d+10)*sizeof(int));
p.listsize=d+10;
for(i=0;i<p.length;i++)
{
scanf("%d",p.elem+i);
}
int l;
int c;
count1 q;
count1 m;
c=0; //0表示q,1表示m
for(i=0;i<p.length;i++)
{
if(i==0)
{
q.s=p.elem;
q.length=1;
m.s=p.elem;
m.length=0;
}
else
{
m.length++;
if(*(p.elem+i)<=*(p.elem+i-1))
{
if(m.length>q.length)
{
q.length=m.length;
q.s=m.s;
}
// printf("%d***%d\n",*(q.s),q.length);
m.s=p.elem+i;
m.length=0;
}
else if(i==p.length-1)
{
if(m.length>q.length)
{
q.length=m.length+1;
q.s=m.s;
}
}
}
}
for(i=0;i<q.length;i++)
{
if(i==0)
{
printf("%d",*(q.s+i));
}
else
{
printf(" %d",*(q.s+i));
}
}
}