给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(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>
#define Maxsize 100005
int main(){
int i,j;//用来遍历序列的下标
int posmax;//记录最长序列的首下标位置
int length;//记录最长序列的长度
i = j = 0;
posmax = 0;
length = 1;
/*题示要求给数组赋值*/
int n;
scanf("%d",&n);
int p[Maxsize];
for(int k = 0;k < n;k++){
scanf("%d",&p[k]);
}
while(++j <= n-1){//数组未曾全部遍历完之前
while(p[j] > p[j-1]){//如果序列递增
j++;
}//循环结束时,此时的j代表的是使序列不再递增的第一个元素
if(j-i > length){
posmax = i;
length = j-i;
}
i = j;
}
for(i = 0;i < length;i++){
if(i != length-1)
printf("%d ",p[posmax+i]);
else
printf("%d",p[posmax+i]);
}
}
比较简单的思想,当一个不断递增的序列停止递增时,即可直接跳过这一序列,因为某一递增序列的子序列长度肯定小于其母序列