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 收藏 评论
分享
牛客网
牛客企业服务