浙大版《数据结构》习题3.4 最长连续递增子序列(20 分)

题目:https://pintia.cn/problem-sets/434/problems/5860

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(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 100000
typedef struct Node{
    int Data[MAXSIZE];
    int size;
}Node, *List; /*传递结构指针效率高*/
List Read(List L);
void PrintSeq(List L);

int main(void){
    Node node;
    List L = &node;
    L = Read(L);
    PrintSeq(L);

    return 0;
}

List Read(List L){
    int n, i;
    scanf("%d", &n);
    L->size = n;
    for(i=0; i<n; i++){
        scanf("%d", &L->Data[i]);
    }

    return L;
}

void PrintSeq(List L){
    int maxL, maxR, maxLen, l, r, len;
    int i;
    if(L->size==0)
        return;
    else{
        maxL=maxR=0;
        maxLen = 1;
    }
    l=r=0;
    len = 1;
    for(i=1; i<L->size; i++){
        if(L->Data[i]>L->Data[i-1]){
            r++;
            len++;
        }
        else{ /*遇到非增长点更新*/
            if(len>maxLen){
                maxL = l;
                maxR = r;
                maxLen = len;
            }
            l=r=i;
            len = 1;
        }
    }
    if(len>maxLen){ /*遍历结束后再次判断以防遗漏*/
        maxL = l;
        maxR = r;
        maxLen = len;
    }

    for(i=maxL; i<=maxR; i++){
        if(i==maxL)
            printf("%d", L->Data[i]);
        else
            printf(" %d", L->Data[i]);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36913610/article/details/82319910