当前位置: 首页 > news >正文

代码随想录算法训练营day43 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

碎碎念:
参考:代码随想录

300.最长递增子序列

题目链接

300.最长递增子序列

思想

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i],以nums[i]为结尾的最长递增子序列的长度,结果要返回dp数组中的最大值。
  2. 确定递推公式:如果nums[i] > nums[j]: dp[i] =max(dp[j]+1, dp[i])。
  3. dp数组的初始化:dp[0] = 1,dp[1]=1
  4. 确定遍历顺序:for循环,i从小到大遍历,j从小到大去遍历或者从大到小遍历都可以,本题解写的时从小到大去遍历。
  5. 打印dp数组:主要用来debug。

题解

// cpp
class Solution {
public:int lengthOfLIS(vector<int>& nums) {if (nums.size() == 1) return nums.size();vector<int> dp(nums.size(), 1);dp[0] = 1;dp[1] = 1;int result = 0;for (int i = 1; i < nums.size(); i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j])dp[i] = max(dp[j] + 1, dp[i]);}if (dp[i] > result)result = dp[i];}return result;}
};
# python
class Solution:def lengthOfLIS(self, nums: List[int]) -> int:if len(nums) <= 1:return len(nums)dp = [1] * len(nums)result = 0for i in range(1, len(nums)):for j in range(0, i):if nums[i] > nums[j]:dp[i] = max(dp[j] + 1, dp[i])if result < dp[i]:result = dp[i]return result

反思

注意对len(nums) <= 1条件的处理。

674. 最长连续递增序列

题目链接

674. 最长连续递增序列

思想

本题和上一题最大的区别在于“连续”。体现在代码里就是递推公式前判断一下当前元素和上一个元素的大小关系,上一题的这部分要判断当前元素和之前所有元素的大小关系。
动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i],以nums[i]为结尾的最长连续递增子序列的长度,结果要返回dp数组中的最大值。
  2. 确定递推公式:如果nums[i] > nums[i-1]: dp[i] = dp[i - 1] + 1
  3. dp数组的初始化:dp[0] = 1,dp[1]=1
  4. 确定遍历顺序:for循环,i从小到大遍历。
  5. 打印dp数组:主要用来debug。

题解

// cpp
class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() <= 1) return nums.size();vector<int> dp(nums.size(), 1);int result = 0;for (int i = 1; i < nums.size(); i++) {if (nums[i - 1] < nums[i])dp[i] = dp[i - 1] + 1;if (dp[i] > result)result = dp[i];}return result;}
};
# python
class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:if len(nums) <= 1:return len(nums)dp = [1] * len(nums)result = 0for i in range(1, len(nums)):if nums[i - 1] < nums[i]:dp[i] = dp[i - 1] + 1if result < dp[i]:result = dp[i]return result

反思

718. 最长重复子数组

题目链接

718. 最长重复子数组

思想

子数组就是连续的子序列。
动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i][j],以i-1为结尾的nums1和以j-1为结尾的nums2,这两个数组的最长重复子数组的长度。结果要返回dp数组中的最大值。
  2. 确定递推公式:如果nums1[i-1]==nums2[j-1],dp[i][j] = dp[i-1][j-1]+1
  3. dp数组的初始化:dp数组的第一行和第一列都没有意义,初始化为0
  4. 确定遍历顺序:两层for循环,遍历nums1和nums2,先遍历谁都可以
  5. 打印dp数组:主要用来debug。注意范围是i<nums1.size(),而不是nums1.size()-1,这点是根据我们对dp数组的定义得出的。

题解

// cpp
class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));int result = 0;for (int i = 1; i <= nums1.size(); i++) {for (int j = 1; j <= nums2.size(); j++) {if (nums1[i - 1] == nums2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;}if (result < dp[i][j]) result = dp[i][j];}}return result;}
};
# python
class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:# 这里注意别把nums1和nums2搞反了dp = [[0] * (len(nums2) + 1) for _ in range(len(nums1) + 1)]result = 0for i in range(1, len(nums1) + 1):for j in range(1, len(nums2) + 1):if nums1[i - 1] == nums2[j - 1]:dp[i][j] = dp[i - 1][j - 1] + 1if result < dp[i][j]:result = dp[i][j]return result

反思

本题也可以做状态压缩。
dp[i][j],以i-1为结尾的nums1和以j-1为结尾的nums2,这两个数组的最长重复子数组的长度。
这样定义递推公式的时候初始化更方便。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 水库大坝安全监测:筑起水坝安全防线
  • 搜索最新全国工商信息的软件
  • 【Spark集群部署系列一】Spark local模式介绍和搭建以及使用(内含Linux安装Anaconda)
  • 代码随想录算法训练营第十六天
  • android13 禁用wifi
  • 【单片机】51单片机入门教程(一):深入理解普通IO口与外部中断
  • 哪些平台和市场备受大卖们青睐?今年第二季度热门平台排行
  • C语言的结构体在内存中是如何存放的?
  • [Spring] Spring事务与事务的传播
  • 以下关于revision历史版本说法正确的是:
  • C语言-使用指针数组作为函数参数,实现对10个字符串进行排序
  • 海南云亿商务咨询有限公司引领抖音电商新潮流
  • 如何高效记录并整理编程学习笔记
  • rsync远程同步服务
  • SpringBoot解决创建项目无法选择JDK8和JDK11
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • android 一些 utils
  • Android开源项目规范总结
  • angular学习第一篇-----环境搭建
  • ES6语法详解(一)
  • Gradle 5.0 正式版发布
  • java中的hashCode
  • js中forEach回调同异步问题
  • October CMS - 快速入门 9 Images And Galleries
  • vue的全局变量和全局拦截请求器
  • Vue小说阅读器(仿追书神器)
  • 从零搭建Koa2 Server
  • 关于Flux,Vuex,Redux的思考
  • 解析 Webpack中import、require、按需加载的执行过程
  • 那些被忽略的 JavaScript 数组方法细节
  • 携程小程序初体验
  • 用Canvas画一棵二叉树
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Java NIO(一)FileChannel
  • # 透过事物看本质的能力怎么培养?
  • #define 用法
  • $L^p$ 调和函数恒为零
  • (11)MSP430F5529 定时器B
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (回溯) LeetCode 77. 组合
  • (四)c52学习之旅-流水LED灯
  • (一)RocketMQ初步认识
  • (原创)可支持最大高度的NestedScrollView
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)winform之ListView
  • (转)大型网站的系统架构
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .Net MVC + EF搭建学生管理系统