文章目录

  • 系列文章目录
  • 前言
  • 题录
    • 53. 最大子数组和
    • 674. 最长连续递增序列
    • 300. 最长递增子序列
    • 718. 最长重复子数组
    • 1143. 最长公共子序列
    • 1035. 不相交的线

系列文章目录

一、 数组类型解题方法一:二分法
二、数组类型解题方法二:双指针法
三、数组类型解题方法三:滑动窗口
四、数组类型解题方法四:模拟
五、链表篇之链表的基础操作和经典题目
六、哈希表篇之经典题目
七、字符串篇之经典题目
八、字符串篇之 KMP
九、解题方法:双指针
十、栈与队列篇之经典题目
十 一、栈与队列篇之 top-K 问题
十 二、二叉树篇之二叉树的前中后序遍历
十 三、二叉树篇之二叉树的层序遍历及相关题目
十 四、二叉树篇之二叉树的属性相关题目
十 五、 二叉树篇之二叉树的修改与构造
十 六、 二叉树篇之二叉搜索树的属性
十 七、二叉树篇之公共祖先问题
十 八、二叉树篇之二叉搜索树的修改与构造
十 九、回溯算法篇之组合问题
二 十、回溯算法篇之分割、子集、全排列问题
二十一、贪心算法篇之入门题目
二十二、贪心算法篇之进阶题目
二十三、动态规划篇之基础题目
二十四、动态规划篇之背包问题:01背包
二十五、动态规划篇之背包问题:完全背包
二十六、动态规划篇之经典问题:打家劫舍
二十七、动态规划篇之买股票问题(一)
更新中 …


前言

刷题路线来自 :代码随想录

题录

53. 最大子数组和

Leetcode 链接

题解:
状态 dp[i]: 区间 [0, i] 以 i 结尾的最大子数组和。
递推公式: dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]) 这里的第 i 个状态只与 第 i - 1 个状态有关
以 nums[i] 结尾的子数组最大和 = max(以 nums[i - 1] 结尾的最大子数组和加上 nums[i], nums[i])
返回值另外记录: res

虽然这道题简单,但是不明白下边这个问题,做完后还是会感觉迷迷糊糊。
为什么 dp[i] 的状态 不能表示 区间 [0, i] 的最大子数组和(重点),这样的化返回值就是 dp 数组最后一个元素,不用另外记录返回值,还方便?
因为如果这样的话,状态 dp[i] 不知道前边状态表示的最大连续子数组和表示的子数组 新增的 nums[i] 是不是连续的,进而无法得到当前状态的最大连续子数组和。

明白了这个道理,对于下边的子序列问题,到底是将 dp 数组的最后一个元素作为返回值还是另外记录返回值,以及连续和不连续的区别就一目了然了。

class Solution {public int maxSubArray(int[] nums) {int[] dp = new int[nums.length];dp[0] = nums[0];int res = nums[0];for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);res = Math.max(res, dp[i]);}return res;}
}

674. 最长连续递增序列

Leetcode 链接

题解:
子序列连续,另外记录返回值
状态 dp[i]:表示以 新增数 nums[i] 结尾的最大连续子数组长度
递推公式:满足 nums[i] > nums[i - 1] ,dp[i] = dp[i - 1] + 1 即可

class Solution {public int findLengthOfLCIS(int[] nums) {int res = 1;int[] dp = new int[nums.length];Arrays.fill(dp, 1);for (int i = 1; i < nums.length; i++) {if (nums[i] > nums[i - 1]) {dp[i] = dp[i - 1] + 1;res = Math.max(res, dp[i]);}}return res;}
}

300. 最长递增子序列

Leetcode 链接

题解:
这里还是需要另外记录返回值,为什么呢?
因为这道题的子序列不连续,第 i 个状态不止和连续的第 i - 1 状态有关,还和前边所有不连续的第 j 个状态优化。dp[j] 需要保存以 j 结尾的最长不连续递增子序列长度,这样第 i 个状态,才能根据判断 nums[i] > nums[j] 来确定 dp[i] 的值,这里的 i 和 j 不一定连续,但是比较的时候应该放在一起看。
状态 dp[i]:以 i 结尾的最长不连续递增子序列长度

class Solution {public int lengthOfLIS(int[] nums) {int len = nums.length;int[] dp = new int[len];// 初始化Arrays.fill(dp, 1);int res = 1;for (int i = 1; i < len; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}// nums 数组以任意下标结尾的子序列都有可能为最长子序列,所以每个子序列遍历完都要进行返回值的更新if (dp[i] > res) res = dp[i];}return res;}
}

718. 最长重复子数组

Leetcode 链接

题解:

题解:
状态 dp[i][j]:以 nums1[i - 1] 和 nums2[j - 1] 结尾的子数组的最长公共连续子序列长度。
每个dp[i][j]状态都有第dp[i - 1][j - 1] 个状态决定,保证了两个子数组都为连续的,返回另外记录

class Solution {public int findLength(int[] nums1, int[] nums2) {int row = nums1.length;int col = nums2.length;int[][] dp = new int[row + 1][col + 1];int res = 0;for (int i = 1; i <= row; i++) {for (int j = 1; j <= col; j++) {if (nums1[i - 1] == nums2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;res = Math.max(res, dp[i][j]);}}}return res;}
}

空间优化:使用一维滚动数组

class Solution {public int findLength(int[] nums1, int[] nums2) {int row = nums1.length;int col = nums2.length;int[] dp = new int[col + 1];int res = 0;for (int i = 1; i <= row; i++) {for (int j = col; j >= 1; j--) {if (nums1[i - 1] == nums2[j - 1]) {dp[j] = dp[j - 1] + 1;res = Math.max(res, dp[j]);} else {dp[j] = 0;}}}return res;}
}

1143. 最长公共子序列

Leetcode 链接


题解:
状态 dp[i][j]:表示[0, i] 子序列1 和 [0, j] 子序列2 的最长公共不连续子序列长度
”abcde“ 和 ”ace“ 在最后一个状态发现结尾都为 e ,此时该状态的值(最长不连续公共子序列)会与"abcd" 和 ”ac“ 状态有关,也就是 dp[i][j] = dp[i - 1][j - 1] + 1,这里和上一个状态是连续的,也就是以 i - 1 和 j - 1 结尾的状态
”abcd“ 和 ”ace“ 时 在最后一个状态结尾不相等,该状态的值与 ”abcd“ 和, ”ac“、”abc“ 和 ”ace“ 两个状态有有关也就是 dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]),这里的状态一定是不连续的

class Solution {public int longestCommonSubsequence(String text1, String text2) {int row = text1.length();int col = text2.length();int[][] dp = new int[row + 1][col + 1];for (int i = 1; i <= row; i++) {for (int j = 1; j <= col; j++) {if (text1.charAt(i - 1) == text2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[row][col];}
}

1035. 不相交的线

Leetcode 链接


题解:
同上题,其实是求最长公共子数组

class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int row = nums1.length;int col = nums2.length;int[][] dp = new int[row + 1][col + 1];for (int i = 1; i <= row; i++) {for (int j = 1; j <= col; j++) {if (nums1[i - 1] == nums2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[row][col];}
}

Leetcode 刷题笔记(二十八) ——动态规划篇之子序列问题:连续子序列和不连续子序列相关推荐

  1. Leetcode刷题笔记:栈与队列篇

    基础知识 栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出. 如图所示: 那么我这里再列出四个关于栈的问题,大家可以思考一下.以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己 ...

  2. 【leetcode刷题笔记】动态规划

    #[leetcode刷题笔记]动态规划 石子游戏 public boolean stoneGame(int[] piles) {int N = piles.length;// dp[i][j] is ...

  3. LeetCode刷题笔记-动态规划-day4

    文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...

  4. 刷题笔记(十四)--二叉树:层序遍历和DFS,BFS

    目录 系列文章目录 前言 题录 102. 二叉树的层序遍历 BFS DFS_前序遍历 107. 二叉树的层序遍历 II BFS DFS 199. 二叉树的右视图 BFS DFS 637. 二叉树的层平 ...

  5. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  6. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  7. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  8. leetcode刷题笔记——二分查找

    leetcode刷题笔记--二分查找 目前完成的贪心相关的leetcode算法题序号: 中等:80,81 困难:4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com ...

  9. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  10. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

最新文章

  1. k-d tree算法
  2. linux怎么退出vim编辑模式_Linux中的vim编辑器使用
  3. 在Angular单元测试代码的it方法里连续调用两次detectChange方法,会触发两次ngAfterViewInit吗
  4. STL中vector和list的区别
  5. 超强Python入门基础知识总结!是时候学起来了
  6. 剑指Offer——跳台阶
  7. oracle12cr2发布时间,Oracle 12cR2 发布在即
  8. git rebase --onto
  9. 第八章、面向对象设计
  10. 主进程退出后子进程还会存在吗?_进程和线程面试常见的19个问题
  11. Java——static修饰符 枚举
  12. 用python做股票因子分析_关于SPSS因子分析的几点总结
  13. 弹性波波长计算公式_弹性波,时域显式接口简介
  14. 计算机接口技术 实验箱,微机原理及接口技术实验箱.doc
  15. NanoMsg框架|NanoMsg的简介
  16. 商品进销存管理系统、ERP系统源码
  17. 混沌数学之Lorenz(洛伦茨)吸引子
  18. ALG:应用层网关(防火墙)
  19. 一招判断云主机IP是不是原生IP
  20. AUTO_ACKNOWLEDGE和CLIENT_ACKNOWLEDGE

热门文章

  1. pandas—显示行索引与列索引(数组或者列表)
  2. 如何为 MySQL 选择 CPU?
  3. 活动目录(LiveFolder)
  4. 博文视点在SD2.0大会上以书会友
  5. 《.Net 软件设计新思维》作者讲述成书的背后故事
  6. Pycharm快捷键设置(鼠标滚动控制字体大小)
  7. pandas小记:pandas高级功能
  8. innodb 索引 mysql_InnoDB索引实现
  9. 鸿蒙冰心有其他途径得到吗,关索除了人遁礼包,还有其他途径能获得吗?
  10. 数据结构单链表的创建和遍历(后插法)