演算法動態規劃裡的經典問題,愛奇藝的程式設計題,要求時間複雜度為o(n2),空間複雜度為o(1)。首先,先講一種比較簡單的思想,就是先將乙個序列排序,然後求兩個序列的最長公共子串行,轉化為lcs問題。
現在,來解這道題,解法是**別人的,做乙個整合吧。
乙個各公司都喜歡拿來做面試筆試題的經典動態規劃問題,網際網路上也有很多文章對該問題進行討論,但是我覺得對該問題的最關鍵的地方,這些討論似乎都解釋的不很清楚,讓人心中不快,所以自己想徹底的搞一搞這個問題,希望能夠將這個問題的細節之處都能夠說清楚。
對於動態規劃問題,往往存在遞推解決方法,這個問題也不例外。要求長度為i的序列的ai最長遞增子串行,需要先求出序列ai-1中以各元素(a1,a2,……,ai-1)作為最大元素的最長遞增序列,然後把所有這些遞增序列與ai比較,如果某個長度為m序列的末尾元素aj(j這其中最長的遞增序列為(35,36,39,42)和(3,15,27,42),所以序列a的最長遞增子串行的長度為4,同時在a中長度為4的遞增子串行不止乙個。
該演算法的思想十分簡單,如果要得出ai序列的最長遞增子串行,就需要計算出ai-1的所有元素作為最大元素的最長遞增序列,依次遞推ai-2,ai-3,……,將此過程倒過來,即可得到遞推演算法,依次推出a1,a2,……,直到推出ai為止,
**如下
1 unsigned int liss(constint array, size_t length, int
result)216
17for(i = 1, max = 1, k = 0; i < length; ++i)
1835}36
}37}38
39//
輸出序列
40 i = max - 1;41
42while(pre[k] !=k)
4347
48 result[i] =array[k];
4950
return
max;
51 }
該函式計算出長度為length的array的最長遞增子串行的長度,作為返回值返回,實際序列儲存在result陣列中,該函式中使用到了c99變長陣列引數特性(這個特性比較贊),不支援c99的同學們可以用malloc來申請函式裡面的兩個陣列變數。
開闢乙個棧,每次取棧頂元素s和讀到的元素a做比較,如果a>s, 則加入棧;如果a第二種方法的時間複雜度平均為o(nlogn)。
#include #includeusing
namespace
std;
char sub[10002
];int binarysearch(char *arr,int len,char
c)
return -1;}
intmain()
} cout
}
return0;
}
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...
最長遞增子串行
最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...
最長遞增子串行
最長遞增子串行 求乙個字串的最長遞增子串行 如 dabdbf最長遞增子串行就是abdf,長度為4 這是一道基本的動態規劃求解的題目,與此類似的還有 最長公共子串行 分析 用一維陣列dp i 來儲存以a i 為末元素的最長遞增子串行的長度,那麼dp i 至少為1 即包含它本身 往前尋找,如果存在a j...