2-3 最长连续递增子序列
分数 6
作者 DS课程组
单位 浙江大学
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数n(≤105);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。
输入样例:
15 1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
|
输出样例:
解析
#include <stdio.h> #include <stdlib.h>
#define MAXSIZE 100000 typedef int ElemType; typedef struct { ElemType *data; int length; int size; }SqList; int main() { SqList L; L.data = (ElemType *)malloc(MAXSIZE * sizeof(ElemType)); int n; scanf("%d", &n);
if (n == 1) { scanf("%d", &L.data[0]); printf("%d", L.data[0]); free(L.data); return 0; }
L.length = n; L.size = MAXSIZE; int i; for (i = 0; i < n; i++) { scanf("%d", &L.data[i]); } int current_len = 1; int max_len = 1; int max_start = 0; int current_start = 0; for (i = 1; i < n; i++) { if (L.data[i] > L.data[i - 1]) { current_len++; } else { if (current_len > max_len) { max_len = current_len; max_start = current_start; } current_len = 1; current_start = i; } } if (current_len > max_len) { max_len = current_len; max_start = current_start; } for (i = max_start; i < max_start + max_len; i++) { printf("%d", L.data[i]); if (i != max_start + max_len - 1) { printf(" "); } } free(L.data); return 0; }
|
注意
首先是可能序列可能是完全递减,所以只输出第一个数字就行记得要先scanf才能输出:)
设当下递增序列长和最长的序列长都为一(长度一刚好最短),当下开始端和最长序列长的开始端
循环是向前比大小,所以i从下标1开始
如果比他大,就当下长度++,如果比他小,就结束长度累计,再如果当下长度大于了最长长度,说明要更新了,
那么更新最大长度和最大长度的开始端
循环做完后要再做一次判断,因为循环是到n结束,有可能此时当下长度大于最大长度,要再次检查是不是需要更新