給定乙個陣列nums,求其最長的遞增子串長度。如陣列[10, 9, 2, 5, 3, 7, 101, 18],其最長遞增子串為[2, 3, 7, 101],長度為4.
方法一:直接遍歷,複雜度為o(n^2)。
方法二:把長度為i + 1的遞增子串的最後元素的最小值記錄在陣列tails中,如對於陣列 [4,5,6,3],tails中的記錄為:
len = 1 : [4], [5], [6], [3] => tails[0] = 3
len = 2 : [4, 5], [5, 6] => tails[1] = 5
len = 3 : [4, 5, 6] => tails[2] = 6
可以證明,tails是乙個遞增的陣列,因此,對於nums中的每乙個元素x,有如下兩種可能:
(1) 如果x大於所有的tails,說明最長的子串可以擴充,新建乙個tails元素,其值為x
(2) 如果tails[i-1] < x <= tails[i], 說明可以把x擴充在長度為 i-1 的遞增子串的末尾,且x因為tails遞增,因此可以用二分法來進行搜尋
public int lengthoflis(int nums)
tails[i] = x; //如果i if (i == size) ++size; //新增
}return size;
}
動態規劃 最長遞增子串行和最長連續遞增子串行
leetcode 674.最長連續遞增序列 題目描述 給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。連續遞增的子串行 可以由兩個下標 l 和 r l r 確定,如果對於每個 l i r,都有 nums i nums i 1 那麼子串行 nums l nums l 1 ...
動態規劃 最長遞增子串行
給出序列 1 2 3 4 2 5 3 4 a 1 1,a 2 2,a 7 3,a 8 4 求其最長的遞增子串行,以上最長遞增子串行為 1 2 3 4 5 問題細分 初始化條件f 1 1,序列只有1個長度即為1 f 2 a 2 與下標小於2的比較,即a 1 比較,a 2 a 1 因此更新f 2 f 1...
動態規劃 最長遞增子串行
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度 例項 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行為 2,3,7,101 長度為4說明 可能會有多種最長上公升子串行的和,只需要輸出對應長度即可 演算法的時間複雜度應為o n2 首先,dp陣列的定義如下 dp...