1. 程式人生 > >300.Longest Increasing Subsequence 最長遞增子序列 動態規劃

300.Longest Increasing Subsequence 最長遞增子序列 動態規劃

題目

給定一個未排序的整數陣列,找到最長遞增子序列的長度。

思路

動態規劃,使用一個數組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])