给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(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<cstdio>
const int maxn = 100010;
int a[maxn];//c++用法
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
a[n] = a[n - 1] - 1;//特殊处理最后一个数字a[n-1]
int pos = 0, length = 1;//记录递增起始位置及长度
int maxpos = 0, maxlen = 1;//记录目前最大递增子序列起始位置,及其长度
for (int i = 0; i < n; i++) {
if (a[i + 1] > a[i]) {//与下一个位置进行比较
length++;
} else {
if (length > maxlen) {
maxpos = pos;
maxlen = length;
}
pos = i + 1;//从下一个位置开始
length = 1;//重置
}
}
printf("%d", a[maxpos]);//对首元素特殊处理
for (int i = 1; i < maxlen; i++) {
printf(" %d", a[maxpos + i]);
}
}