LIS

教材经典DP,O(n^2)的算法可以明显看出来就是序列型DP

class Solution(object):
    def lengthOfLIS(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        dp = [0] * (n + 1)

        for i in xrange(1, n + 1):
            dp[i] = 1
            for j in xrange(1, i):
                if nums[j - 1] < nums[i - 1]:
                    dp[i] = max(dp[i], dp[j] + 1)

        return max(dp)

这题还有一个隐藏的个人觉得并不算DP的O(nlgn)的做法,它通过维护一个保持递增的DP序列,同时每次对新元素进行二分搜索找到它在dp序列上的位置并将对应位置改为当前元素来找到这个最长dp序列,最后的dp序列不一定是真正的最长LIS但肯定长度和最长的LIS长度一样(这一点也是不太好弄懂的地方)

class Solution(object):
    def lengthOfLIS(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        dp = []

        for num in nums:
            index = bisect.bisect_left(dp, num)
            if index >= len(dp):
                dp.append(num)
            else:
                dp[index] = num

        return len(dp)

results matching ""

    No results matching ""