674. 最长连续递增序列
题目描述:
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。
和 300. 最长递增子序列区别在于,本题要求递增子序列需要是连续的。
这样,这题反而会更简单一些...
- 本题一层 for 比较 nums[i] > nums[i - 1] 就行了;
- 不用像 300. 最长递增子序列两层 for 比较 nums[i] > nums[j](j在 [0, i]之间)
dp五步曲:
- dp[i] 表示以 i 结尾(不一定要从0开始)的连续递增子序列的长度
- 递推公式
- if (nums[i] > nums[i - 1]) // 确保连续 & 递增
- dp[i] = dp[i - 1] + 1;// 2、递推公式
- 初始化
- 最小长度为 1,所有 dp[i] 初始化均为 1
- 顺序:前到后
- 打印dp
注意:这里不能返回 dp[n -1],而是 return dp 数组中的 max 值
392. 判断子序列
题目描述:
给定字符串 s 和 t,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
这里的子序列,不要求连续。只要相对顺序一致就 ok。
dp五部曲:
- dpi 表示s中下标[0,i-1]与t下标在[0,j-1]中,相同子序列长度为dpi
- 递推公式:(两种情况)
if (s.charAt(i - 1) == t.charAt(j - 1))
dpi = dpi - 1 + 1;
当前元素匹配,相当于当前长度为去掉 s[i-1]和t[j-1]的长度加一,即dpi = dpi - 1 + 1;
if (s.charAt(i - 1) != t.charAt(j - 1)) // 需要删去 t[j]
dpi = dpi;
相当于看s[i-1]与 t[i-2]比较
- 初始化
dp0 = 0; 表示空串s与t下标在[0,j-1]中,不可能有相同子序列,所以全为0 dpi = 0; 表示空串t与s下标在[0,i-1]中,不可能有相同子序列,所以全为0
全站分卷索引 · 42 卷
- 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
- 2找出所有子集的异或总和再求和
- 3哈希表
- 4哈希冲突
- 5红黑树与AVL树
- 6平衡二叉树(AVL树)
- 7将有序数组转换为二叉搜索树
- 83. 分割(组合问题)
- 9方法论
- 10509. 斐波那契数
- 1162. 不同路径
- 1296. 不同的二叉搜索树
- 13322. 零钱兑换
- 14爬楼梯
- 15背包小总结 (01背包、完全背包)
- 16子序列问题
- 17674. 最长连续递增序列
- 18115. 不同的子序列
- 19总结
- 20技巧总结
- 21时间序列模型
- 22区间DP模型
- 23664. 奇怪的打印机
- 24编辑距离
- 25回文串
- 26DP递推公式总结
- 27排序算法
- 28其他算法
- 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
- 302. TOP N问题
- 313. 分布式的TOP N问题
- 322. Astar数据结构 + 公式
- 334. 代码实现
- 345. 总体代码
- 35堆排序
- 36单源最短路
- 37思维导图
- 38链表
- 39回溯
- 40贪心
- 41动态规划
- 42排序