力扣练习之最长递增子序列

我爱海鲸 2023-04-20 16:21:46 力扣、中级算法

简介中级算法、动态规划、汤姆

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xwhvq3/

解法一:

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        n = len(nums)
        d = []
        for i in range(n):
            if not d or nums[i] > d[-1]:
                d.append(nums[i])
            else:
                l, r = 0, len(d) - 1
                while (l < r):
                    mid = (l + r) // 2
                    if (d[mid] < nums[i]):
                        l = mid + 1
                    else:
                        r = mid
                d[l] = nums[i]
        return len(d)

思路:二分查找法,定义一个数组用来保存最大子序数组d,遍历数组 nums,对于每个元素 nums[i],我们在 d 数组中查找第一个大于等于 nums[i] 的元素 d[j],然后更新 d[j] 的值为 nums[i]。如果不存在这样的元素 d[j],则说明 nums[i] 大于 d 数组中的所有元素,此时我们将 nums[i] 添加到 d 数组的末尾。

你好:我的2025