300.Longest Increasing Subsequence 最長遞增子序列 動態規劃
阿新 • • 發佈:2018-12-21
題目
給定一個未排序的整數陣列,找到最長遞增子序列的長度。
思路
動態規劃,使用一個數組dp記錄原陣列每一個位置的數字和到這個位置為止的最長子序列長度,dp陣列元素是元組——(a:當前位置最長子序列長度,b:當前位置數字),遍歷陣列,每遍歷到一個數字i,找到dp數組裡面b小於i的全部元組裡面最大的a記為x,向dp陣列追加一個元組(x+1, i),這樣dp數組裡面記錄了原陣列截至至每一個位置的最長遞增子序列,最後求個最大值即可。
例如:[10,9,2,5,3,7,101,18]
dp為[(1,10),(1,9),(1,2),(2,5),(2,3),(3,7),(4,101),(4,18)]
程式碼
class Solution: def lengthOfLIS(self, nums): """ :type nums: List[int] :rtype: int """ if not nums: return 0 dp = [] for i in nums: front = [x[0] for x in dp if x[1]<i] if front: dp.append((max(front)+1, i)) else: dp.append((1, i)) return max([x[0] for x in dp])