給你乙個整數陣列 nums ,找到其中最長嚴格遞增子串行的長度。
子串行是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子串行。
難度:中等
示例 1:
輸入:nums = [10,9,2,5,3,7,101,18]
輸出:4
解釋:最長遞增子串行是 [2,3,7,101],因此長度為 4 。
示例 2:
輸入:nums = [0,1,0,3,2,3]
輸出:4
動態規劃
定義dp[i] 為考慮前 i 個元素,以第 ii 個數字結尾的最長上公升子串行的長度,注意nums[i] 必須被選取。
我們從小到大計算 dp 陣列的值,在計算 dp[i] 之前,我們已經計算出dp[0…i−1] 的值,則狀態轉移方程為:
dp[i]=max(dp[j])+1,其中0≤j即考慮往dp[0…i−1] 中最長的上公升子串行後面再加乙個nums[i]。由於dp[j] 代表 nums[0…j] 中以nums[j] 結尾的最長上公升子串行,所以如果能從dp[j] 這個狀態轉移過來,那麼 nums[i] 必然要大於 nums[j],才能將 nums[i] 放在 nums[j] 後面以形成更長的上公升子串行。
最後,整個陣列的最長上公升子串行即所有 dp[i] 中的最大值。
lis(length)=max(dp[i]),其中0≤i nums[j])
}maxans = math.max(maxans, dp[i]);
}return maxans;
}
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度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...