• Roy Liang
    2020-10-20
    最长连续递增序列那里: >>最后,我们来看一看决策是什么。考虑一下,在什么情况下,当前子问题的解需要根据子问题的子问题计算得出呢?原问题问的是最长连续递增序列。因此,当 DP[i]>DP[i−1] 时,我们需要更新当前子问题的答案,这就是该问题的决策。 这里的条件DP[i]>DP[i−1]是不是有笔误?应该是nums[i] > nums[i-1],后面的代码就是这样的

    作者回复: 笔误。感谢指正。

    
    2
  • BBQ
    2021-03-07
    #借助一个单调递增数组,用二分法将最长子序列的复杂度变为 nlogn def lengthOfLIS(self, nums: List[int]) -> int: if not nums: return 0 #dp = [0] * len(nums) tail = [nums[0]] #准备 tail数组,如果大于tail[-1] 就加上去,如果小于,就找到第一个大于等于target的,替换掉 for i in range(1, len(nums)): if nums[i] > tail[-1]: tail.append(nums[i]) else: left, right = 0, len(tail) - 1 while left < right: mid = left + ((right-left)>>1) if tail[mid] < nums[i]: left = mid + 1 else: right = mid tail[left] = nums[i] #替换掉 return len(tail)

    作者回复: 没有问题,每个问题就应该多加思考,这样遇到类似问题才能真的举一反三。极力提倡大家尽量自己多思考,不断优化解法,才能融会贯通,真正把知识变成自己的东西。 顶顶顶

    
    1
  • Geek_b16406
    2022-07-14 来自上海
    如果count[i]定义为长度为i的最长子序列,则不需要状态转移方程。只需要再“最长递增子序列长度”代码的基础上稍作修改,不用额外的两个for循环

    作者回复: 这样的话需要在上面的循环里去根据现在count[i]的逻辑来处理这个数量,其实和加一个循环在时间复杂度上没有差别,也是可以实现的。文中是想把两个逻辑尽量分开,便于解读。

    共 2 条评论
    
  • Geek_f8ca86
    2021-03-09
    最长连续递增序列的备忘录意义,应该是以i为结尾的最长连续递增序列,而不是从0到i吧?

    作者回复: 恩,的确应该是以 i 为结尾的最长连续递增序列,res是0到i中的最长连续递增序列。正文做了更新和修正,感谢指正!

    
    
  • CD
    2020-10-26
    另外层循环的数字下标为 j,内部循环的数字下标为 i 大家都是最外层 i 里面是j

    作者回复: 这是由于在讲述过程中假设 i ... j (i < j) 的缘故。

    
    
  • 我来也
    2020-10-09
    老师将 最长上升子序列长度 变种到 求数量,就理解为什么要留这个课后思考题了。 课后思考题: 利用二分查找,将内层循环到时间复杂度从O(n)降低到O(logn)。 偷个懒 直接上链接: https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode-soluti

    作者回复: 很好,所有的题目都要自己动手验证。

    
    