lintcode 76 最長上公升子串行

2022-03-29 17:57:59 字數 1144 閱讀 3626

給定乙個整數序列,找到最長上公升子串行(lis),返回lis的長度。

說明最長上公升子串行的定義:

最長上公升子串行問題是在乙個無序的給定序列中找到乙個盡可能長的由低到高排列的子串行,這種子串行不一定是連續的或者唯一的。

樣例給出 [5,4,1,2,3],lis 是 [1,2,3],返回 3

給出 [4,2,4,5,3,7],lis 是 [2,4,5,7],返回 4

挑戰要求時間複雜度為o(n^2) 或者 o(nlogn)

標籤

思路

參見部落格利用棧和二分查詢。

這個演算法其實已經不是dp了,有點像貪心。至於複雜度降低其實是因為這個演算法裡面用到了二分搜尋。本來有n個數要處理是o(n),每次計算要查詢n次還是o(n),一共就是o(n^2);現在搜尋換成了o(logn)的二分搜尋,總的複雜度就變為o(nlogn)了。

這個演算法的具體操作如下(by ryanwang):

開乙個棧,每次取棧頂元素top和讀到的元素temp做比較,如果temp > top 則將temp入棧;如果temp < top則二分查詢棧中的比temp大的第1個數,並用temp替換它。 最長序列長度即為棧的大小top。

這也是很好理解的,對於x和y,如果x < y且stack[y] < stack[x],用stack[x]替換stack[y],此時的最長序列長度沒有改變但序列q的''潛力''增大了。

舉例:原序列為1,5,8,3,6,7

棧為1,5,8,此時讀到3,用3替換5,得到1,3,8; 再讀6,用6替換8,得到1,3,6;再讀7,得到最終棧為1,3,6,7。最長遞增子串行為長度4。

當出現1,5,8,2這種情況時,棧內最後的數是1,2,8不是正確的序列啊?難道錯了?

分析一下,我們可以看出,雖然有些時候這樣得不到正確的序列了,但最後算出來的個數是沒錯的,為什麼呢?

想想,當temp>top時,總個數直接加1,這肯定沒錯;但當tempcode

class solution 

stack.push_back(nums[0]);

for(i=1; istack[mid])

else

}stack[low] = nums[i];}}

return stack.size();

}};

lintcode 76 最長上公升子串行

最長上公升子串行的定義 最長上公升子串行問題是在乙個無序的給定序列中找到乙個盡可能長的由低到高排列的子串行,這種子串行不一定是連續的或者唯一的。給出 5,4,1,2,3 lis 是 1,2,3 返回 3 給出 4,2,4,5,3,7 lis 是 2,4,5,7 返回 4建立乙個陣列dp,dp i 表...

lintcode練習 76 最長上公升子串行

給定乙個整數序列,找到最長上公升子串行 lis 返回lis的長度。給出 5,4,1,2,3 lis 是 1,2,3 返回3 給出 4,2,4,5,3,7 lis 是 2,4,5,7 返回4 要求時間複雜度為o n 2 或者 o nlogn 最長上公升子串行的定義 最長上公升子串行問題是在乙個無序的給...

76 最長上公升子串行

原題 您在真實的面試中是否遇到過這個題?是 最長上公升子串行問題是在乙個無序的給定序列中找到乙個盡可能長的由低到高排列的子串行,這種子串行不一定是連續的或者唯一的。給出 4,2,4,5,3,7 lis 是 2,4,5,7 返回4 標籤 二分法動態規劃 dp o n 2 思路 動態規劃,dp i 為以...