Leetcode 300 最长上升子序列

2020-06-27  本文已影响0人  SunnyQjm

最长上升子序列

题目

给定一个无序的整数数组,找到其中最长上升子序列的长度。

说明:

进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

解答

测试验证

class Solution:
    def lengthOfLIS(self, nums):
        """
        :type nums: List[int]
        :rtype int

        (knowledge)

        思路:
        nums => size = n
        1. 采用动态规划的思想;
        2. dp[i] => 表示[i:n-1]范围内的最长的上升子序列的长度;
        3. 状态转移方程:
            f(i) = 1                                                i == n - 1
                   1 + max{f(j) | nums[j] > nums[i] && i < j < n}   i < n - 1
        """
        if not nums:
            return 0
        length = len(nums)
        dp, result = [1 for i in range(length)], 1

        for i in range(length - 2, -1, -1):
            for j in range(i + 1, length):
                if nums[j] > nums[i]:
                    dp[i] = max(dp[i], 1 + dp[j])
        return max(dp)


if __name__ == '__main__':
    solution = Solution()
    print(solution.lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]), "= 4")
上一篇 下一篇

猜你喜欢

热点阅读