微軟演算法面試題:如何找最長的增長子序列
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
這個問題是微軟提出來的。
給定一組數字,找出陣列中最長的增長子序列的長度。子序列不一定必須是連續的。
例如,給定陣列[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15],最長的增長子序列的長度為6:它是0,2,6,9,11,15。
解決方案
解決這個問題的蠻力方法是生成每個可能的子序列,然後測試每個子序列的單調性並保持跟蹤最長的那個。這將非常昂貴:生成每個子序列就得O(2^N)!
相反,我們可以試著用遞迴來解決這個問題,然後用動態程式設計來優化。
假設我們已經有了一個函式,這個函式給了我們最長增長子序列的長度。然後我們將試著將輸入陣列的一部分反饋給它並嘗試擴充套件結果。基本情況是:空列表,返回0;有一個元素的陣列,返回1。
然後
- 對於直到倒數第二個元素為止的每個索引i,計算longest_increasing_subsequence到那裡為止。
- 如果最後一個元素大於arr[i],我們就用最後一個元素來擴充套件結果(因為否則它就不是增長的了)。
- 保持跟蹤最大的結果。
def longest_increasing_subsequence(arr): if not arr: return 0 if len(arr) == 1: return 1 max_ending_here = 0 for i in range(len(arr)): ending_at_i = longest_increasing_subsequence(arr[:i]) if arr[-1] > arr[i - 1] and ending_at_i + 1 > max_ending_here: max_ending_here = ending_at_i + 1 return max_ending_here
由於重複的子計算(指數時間),所以這會非常非常慢。因此,讓我們通過動態程式設計來儲存值以便稍後重新計算它們。
我們將儲存一個長度為N的陣列A,並且A[i]將包含以i結尾的最長增長子序列的長度。然後,我們可以使用相同的遞迴迴圈,轉而在陣列中查詢:
def longest_increasing_subsequence(arr): if not arr: return 0 cache = [1] * len(arr) for i in range(1, len(arr)): for j in range(i): if arr[i] > arr[j]: cache[i] = max(cache[i], cache[j] + 1) return max(cache)
現在的時間複雜度和空間複雜度為O(N^2)和 O(N)。
你是正在準備面試程式設計工作,還是正享受於程式設計的樂趣中?不管怎樣,知識是靠積累的。祝編碼快樂!
譯文連結:http://www.codeceo.com/article/find-the-longest-increasing-subsequence.html
英文原文:How to Find the Longest Increasing Subsequence
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- 演算法題:最長公共子序列演算法
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- Amazon面試題:尋找最長迴文子串面試題
- 最長公共子序列
- 最長上升子序列
- LCS 演算法:Javascript 最長公共子序列演算法JavaScript
- 最長公共子序列(JAVA)Java
- 最長上升子序列(LIS)的兩種演算法演算法
- 經典演算法題每日演練——最長公共子序列演算法
- Day 45 | 300.最長遞增子序列 、674. 最長連續遞增序列 、718. 最長重複子陣列陣列
- [譯] Swift 演算法學院 - 最長公共子序列演算法Swift演算法
- “最長公共字串子序列”問題的動態規劃法演算法字串動態規劃演算法
- java 實現 最長公共子序列Java
- 最長公共子序列求方案數
- 線性dp:最長上升子序列
- 線性dp:最長公共子序列
- [演算法筆記]動態規劃之最長公共子串和最長公共子序列演算法筆記動態規劃
- 程式碼隨想錄演算法訓練營 | 300.最長遞增子序列,674. 最長連續遞增序列,718. 最長重複子陣列演算法陣列
- 動態規劃求解最長上升子序列問題動態規劃
- 最長公共子序列問題—動態規劃sdut動態規劃
- [題解]P1439 【模板】最長公共子序列
- 以最長公共子序列問題理解動態規劃演算法(DP)動態規劃演算法
- 最長公共子序列的程式碼實現
- 動態規劃:最長上升子序列動態規劃
- 最長上升子序列動態規劃動態規劃
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃
- 最長等差數列;及子序列分析
- 程式碼隨想錄演算法訓練營第49天 | 300.最長遞增子序列 、674. 最長連續遞增序列 、718. 最長重複子陣列演算法陣列
- 領釦LintCode演算法問題答案-77. 最長公共子序列演算法
- 動態規劃經典問題----最長公共子序列動態規劃
- 力扣1143. 最長公共子序列 動態規劃之最長公共子序列力扣動態規劃
- 動態規劃-最長上升子序列模型動態規劃模型
- 動態規劃(最長公共子序列LCS)動態規劃
- NlogN 求最長不下降子序列(LIS)
- 【部分轉載】:【lower_bound、upperbound講解、二分查詢、最長上升子序列(LIS)、最長下降子序列模版】
- 最長遞增子序列
- 最長公共子序列,遞迴簡單程式碼遞迴