1. 程式人生 > >浙大版《資料結構》習題3.4 最長連續遞增子序列(20 分)

浙大版《資料結構》習題3.4 最長連續遞增子序列(20 分)

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(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>
#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]); } }