习题3.4 最长连续递增子序列
题目要求:
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数n(≤10^5 );第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。
代码:
#include<stdio.h>
int main(void){
int n,i,j,max=0,b;
int flag1=-1,flag2,sign=0,count=0;
scanf("%d",&n);
if(n==1){
scanf("%d",&b);
printf("%d",b);
return 0;
}
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]<a[i+1]){
count++;
if(sign==0){
sign=1;
flag1=i;
}
}
else{
if(flag1==-1){
flag1=i;
}
count++;
if(max<count){
max=count;
flag2=flag1;
}
sign=0;
count=0;
}
}
printf("%d",a[flag2]);
for(i=flag2+1;i<flag2+max;i++){
printf(" %d",a[i]);
}
return 0;
}
本题思路:
1、写的异常麻烦,用到了很多标记符号,总体的意思上是:遍历一遍顺序表,每遇到一个递增的子串就记录下起始位置,之后判断下一个值是否仍然满足递增,将每个子串长度记录下来,并且记录下最长子串的长度和起始位置。之后按最长子串打印。
2、当输入只有一个数的时候没办法简化,很恼火,等过两天心情好了再做简化。