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

输出样例:

3 4 6 8

解析

#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结束,有可能此时当下长度大于最大长度,要再次检查是不是需要更新