300. Longest Increasing Subsequence

乍一看以为subsequence要连续,还想用 sliding window做,一看example,可以不连续。

允许不连续的话,就可以递归解,当前列的最长subsequece,取决于当前列最后一个元素,以及去掉这个元素的子列的关系。逻辑有点绕,写出来仿佛写了个假dp...

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        n = len(nums)
        if n <= 1: return n
        memo = collections.defaultdict(lambda : 1)
        
        def getLIS(idx):
            if idx in memo.keys(): return memo[idx]
            for l in range(idx):
                if nums[l] < nums[idx]:
                    memo[idx] = max(memo[idx], getLIS(l)+1)
            return memo[idx]
        
        for r in range(1, n):
            getLIS(r)
            
        return max(memo.values())

看到O(n*logn) 的解法了,DP + Binary Search,不写了。

Last updated

Was this helpful?