最长连续递增子序列

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(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

#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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值