300.最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序.
思路:
dp数组:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。
状态转移方程与遍历顺序:先遍历i, for i in range(1, n),下一层遍历 i 之前的元素 j 。if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1)。
动态规划其实是暴力解法。用二分法会快很多。
674. 最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。
思路:
dp数组:以下标i为结尾的连续递增的子序列长度为dp[i]。
递推公式:如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度就可以加 一 dp[i] = dp[i - 1] + 1;
718. 最长重复子数组
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
思路:
dp数组:dp[i][j] 是以A[i - 1]为结尾,和以B[j - 1]为结尾的B,最长重复子数组长度。初始化为0.
递推公式:当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;
以下是卡哥资料
300.最长递增子序列
今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。
视频讲解:https://www.bilibili.com/video/BV1ng411J7xP
https://programmercarl.com/0300.%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97.html
674. 最长连续递增序列
本题相对于昨天的动态规划:300.最长递增子序列 最大的区别在于“连续”。 先尝试自己做做,感受一下区别
视频讲解:https://www.bilibili.com/video/BV1bD4y1778v
718. 最长重复子数组
稍有难度,要使用二维dp数组了
视频讲解:https://www.bilibili.com/video/BV178411H7hV
https://programmercarl.com/0718.%E6%9C%80%E9%95%BF%E9%87%8D%E5%A4%8D%E5%AD%90%E6%95%B0%E7%BB%84.html