給定乙個長度為n的陣列,找出乙個最長的單調自增子序列(不一定連續,但是順序不能亂)。例如:給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4
這個演算法採用dp策略,核心是維護乙個end陣列,其中end[i]代表以parray[i]作為子陣列的最後乙個數時,這個子陣列的最大長度,那麼end[i+1]要麼等於end[ j ]+1,要麼等於1,0=
parray[0]到parray[i-1]都小,與前面的子串行不能構成遞增序列。當end[i+1]等於end[ j ]+1的時候,說明parray[i]>parray[j], 從而與之構成遞增子串行,所對應的最長子序列長度也就是end[ j ]+1;
**如下:
int lis(int *parray,int nsize)
int *plis=new int[nsize];
plis[0]=1;
for (int i=1;iparray[j]&&plis[j]+1>plis[i])
//這個判斷決定plis[i]會取最大的那個
}} delete plis;
}
筆試 面試 最長遞增子串行
最長遞增 或者非遞減 子串行 如果存在多個這樣的序列的話,就只需找出其中乙個。並且,該序列中的元素在子集中也得保有其原有順序。例如,對於 3,1,0,2,4 這個序列來說,1,2,4 就是它的乙個解。遍歷 判斷 from itertools import combinations def lis s...
面試題之演算法部分 LIS最長遞增子串行
動態規劃法 假設陣列a中元素為 設l j 為以aj結尾的子陣列序列的最長遞增子串行的長度。要用動態規劃來求解,則必須找到遞推關係式,即要找到當前狀態l j 與過去狀態l j 1 l j 2 l 0 之間的關係。假設我們已經求出了l j 1 l j 2 l 0 那麼如何得到l j 呢,我們這樣來做,要...
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...