day43 | 最长子序列

300.最长递增子序列

首先是动态规划的方法 if nums[i]>nums[j]:dp[i]=max(dp[i],dp[j]+1) 每遍历一个 i 的时候就需要遍历前面的所有num,来更新最长的长度。复杂度是O^2

然后是 DAG 的算法, 求最长递增子序列的过程可以看做是这样的图 426783

一个注意点就是,我们维持一个当前最小的子序列,如果后续有比它还小的树,则需要更新当前最小的子序列,在图中的例子就是已经有 4 了 同时要更新一个 2,尽管 4 的子序列长度可能会比 2 更长,但后续可能存在多个比 2 大数字最终导致 2 的子序列更长。

然后在更新 2 的过程我们实际上是在一个有序list 里找到第一个比它大的数字。这可以用二分法来解决。

此处可以参考hello 算法里面的查找插入点。一个显而易见的想法就是二分结束时一定有:i 指向首个大于 target 的元素,j 指向首个小于 target 的元素。易得当数组不包含 target 时,插入索引为 i 。

674. 最长连续递增序列

因为是递增的所以只用考虑 i-1的情况

718. 最长重复子数组

为了方便初始化,所以dp[i]实际上表示的以i-1为结尾的长度。 需要注意的是dp[i][j]依赖 dp[i-1][j-1]进行递推,而 dp[i-1]的含义实际上是 i-2 结尾的长度。 此处容易和nums[i-1]的i-1混淆

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务