面試題(十一)最長遞增子序列
阿新 • • 發佈:2019-02-14
給定一個長度為N的陣列,找出一個最長的單調自增子序列(不一定連續,但是順序不能亂)。例如:給定一個長度為6的陣列A{5, 6, 7, 1, 2, 8},則其最長的單調遞增子序列為{5,6,7,8},長度為4
這個演算法採用DP策略,核心是維護一個END陣列,其中END[i]代表以pArray[i]作為子陣列的最後一個數時,這個子陣列的最大長度,那麼END[i+1]要麼等於END[ j ]+1,要麼等於1,0=<j<=i-1, 當END[i]等於1時候,說明pArray[i]比前面的
pArray[0]到pArray[i-1]都小,與前面的子序列不能構成遞增序列。當END[i+1]等於END[ j ]+1的時候,說明pArray[i]>pArray[j], 從而與之構成遞增子序列,所對應的最長子序列長度也就是END[ j ]+1;
程式碼如下:
int LIS(int *pArray,int nSize) { if (pArray==NULL) { return -1; } int *pLIS=new int[nSize]; pLIS[0]=1; for (int i=1;i<nSize;i++) { pLIS[i]=1; for (int j=0;j<i;j++) { if (pArray[i]>pArray[j]&&pLIS[j]+1>pLIS[i]) //這個判斷決定pLIS[i]會取最大的那個 { pLIS[i]=pLIS[j]+1; } } } delete []pLIS; }