给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(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>
#include<malloc.h>
#include<math.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 0
typedef int ElemType;
typedef int Status;
typedef struct Sqlist{
ElemType* elem;
int length;
int listsize;
}Sqlist;//定义一个顺序表
Status InitList_Sq(Sqlist &L){
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.listsize=LIST_INIT_SIZE;
L.length=0;
return 1;
}//初始化顺序表
void PrintMax(Sqlist L);
int main()
{
Sqlist L;
int n;
scanf("%d",&n);
if(n>pow(10,5))//判断n是否合法
return 0;
else{
InitList_Sq(L);
if(n>L.listsize)//判断n是否大于顺序表的初始容量,如果大于则进行扩容。
{
L.elem=(ElemType*)realloc(L.elem,(L.listsize+n*LISTINCREMENT)*sizeof(int));
if(!L.elem)
return 0;
L.listsize+=n*LISTINCREMENT;
}
L.length=n;
for(int i=0;i<n;i++)//循环输入表内元素。
scanf("%d",L.elem+i);
}
PrintMax(L);//查找最长连续递增子序列并输出
}
void PrintMax(Sqlist L)
{
int i,left=0,right=0,maxlen=0,len=0,t=0;
for(i=0;i<L.length;i++)//如果递增,则长度加一,不再递增,则长度清零重新开始算
{
len++;
if(len>maxlen)//如果新的大于旧的,则进行替换
{
maxlen=len;
left=t;
right=i;
}
if(*(L.elem+i)>=*(L.elem+i+1))//如果不再递增,则从“i+1”处开始重新往后进行判断
{
len=0;
t=i+1;
}
}
for(i=left;i<right;i++)//输出找到的最长连续递增子序列
printf("%d ",*(L.elem+i));
printf("%d",*(L.elem+i));
}