浙大版《資料結構》習題3.4 最長連續遞增子序列(20 分)
阿新 • • 發佈:2018-12-24
給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。
輸入格式:
輸入第1行給出正整數;第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]);
}
}