题目:https://pintia.cn/problem-sets/434/problems/5860
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数
;第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>
#define MAXSIZE 100000
typedef struct Node{
int Data[MAXSIZE];
int size;
}Node, *List; /*传递结构指针效率高*/
List Read(List L);
void PrintSeq(List L);
int main(void){
Node node;
List L = &node;
L = Read(L);
PrintSeq(L);
return 0;
}
List Read(List L){
int n, i;
scanf("%d", &n);
L->size = n;
for(i=0; i<n; i++){
scanf("%d", &L->Data[i]);
}
return L;
}
void PrintSeq(List L){
int maxL, maxR, maxLen, l, r, len;
int i;
if(L->size==0)
return;
else{
maxL=maxR=0;
maxLen = 1;
}
l=r=0;
len = 1;
for(i=1; i<L->size; i++){
if(L->Data[i]>L->Data[i-1]){
r++;
len++;
}
else{ /*遇到非增长点更新*/
if(len>maxLen){
maxL = l;
maxR = r;
maxLen = len;
}
l=r=i;
len = 1;
}
}
if(len>maxLen){ /*遍历结束后再次判断以防遗漏*/
maxL = l;
maxR = r;
maxLen = len;
}
for(i=maxL; i<=maxR; i++){
if(i==maxL)
printf("%d", L->Data[i]);
else
printf(" %d", L->Data[i]);
}
}