代码随想录算法训练营Day52|LC300 最长递增子序列LC 674 最长连续递增序列LC 718 最长重复子数组

一句话总结:动规做多了就豁然开朗了。

原题链接:300 最长递增子序列

 按照动规五部曲:

  1. 首先确定dp数组及下标的含义:dp[i]表示以nums[i]结尾的最长子序列的长度;
  2. 确定状态转移方程:如果nums[i] > nums[j](其中j < i),那么dp[i] = Math.max(dp[i], dp[j] + 1),即位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值;
  3. dp数组的初始化:每个子序列最开始都是1,所以初始化为1;
  4. 数组的遍历顺序:可见dp[i]取决于每一个小于i的j的值,因此从前往后遍历;
  5. 举例推导dp数组:过程略。

最终代码如下:

class Solution {public int lengthOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];Arrays.fill(dp, 1);int ans = 1;for (int i = 1; i < n; ++i) {for (int j = 0; j < i; ++j) {if (nums[j] < nums[i]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}ans = Math.max(dp[i], ans);}return ans;}
}

原题链接: 674 最长连续递增序列

找的是连续递增子序列,因此直接一次遍历即可解决,如果当前数大于前一个数,那么cnt+1,否则将cnt重置为1。最后取所有cnt值中最大的一位即可。

class Solution {public int findLengthOfLCIS(int[] nums) {int n = nums.length;int ans = 1, cnt = 1;for (int i = 1; i < n; ++i) {if (nums[i] > nums[i - 1]) ++cnt;else cnt = 1;ans = Math.max(ans, cnt);}return ans;}
}

这里用的是贪心思想,动规做法即上一题的改动,一趟遍历即可,过程差不多。

原题链接:718 最长重复子数组

最基础的做法是二维dp数组。按照动规五部曲,过程如下:

  1. 确定dp数组及下标的含义:dp[i][j]表示nums1数组的第i位与nums2数组的第j位的最长重复子数组的长度;
  2. 确定状态转移方程:dp[i][j]只能由dp[i - 1][j - 1]推导而来,即if (nums1[i - 1] == nums2[j - 1]) {dp[[i][j] = dp[i - 1][j - 1] + 1}。而如果两者不等,那么即为0;
  3. dp数组的初始化:为了递归方便,所有dp[i][0] 和所有dp[0][i]都初始化为0;
  4. 确定dp数组的遍历顺序:从前往后,两层循环分别对nums1数组和nums2数组遍历即可;
  5. 举例推导dp数组:过程略。

最终代码如下:

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

另有滚动数组解法,利用一维dp数组即可。需要注意内层循环为了避免重复覆盖,因此采用从后往前遍历顺序。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/610935.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

风储微网虚拟惯性控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 风储微网虚拟惯性控制系统simulink建模与仿真。风储微网虚拟惯性控制系统是一种模仿传统同步发电机惯性特性的控制策略&#xff0c;它通过集成风力发电系统、储能系统和其他分…

Java工具类:批量发送邮件(带附件)

​ 不好用请移至评论区揍我 原创代码&#xff0c;请勿转载&#xff0c;谢谢&#xff01; 一、介绍 用于给用户发送特定的邮件内容&#xff0c;支持附件、批量发送邮箱账号必须要开启 SMTP 服务&#xff08;具体见下文教程&#xff09;本文邮箱设置示例以”网易邮箱“为例&…

微服务学习(黑马)

学习黑马的微服务课程的笔记 导学 微服务架构 认识微服务 SpringCloud spring.io/projects/spring-cloud/ 服务拆分和远程调用 根据订单id查询订单功能 存在的问题 硬编码 eureka注册中心 搭建eureka 服务注册 在order-service中完成服务拉取 Ribbon负载均衡 Nacos注册中心…

ELK-Kibana 部署

目录 一、在 node1 节点上操作 1.1.安装 Kibana 1.2.设置 Kibana 的主配置文件 1.3.启动 Kibana 服务 1.4.验证 Kibana 1.5.将 Apache 服务器的日志&#xff08;访问的、错误的&#xff09;添加到 ES 并通过 Kibana 显示 1.6. 浏览器访问 二、部署FilebeatELK&…

使用 Axios 处理 AxiosError 的三种常见方法

在使用 Axios 时处理 AxiosError 有几种常见的方法: 使用 try-catch 语句捕获异常: try {const response await axios.get(/api/data);// 处理响应数据 } catch (error) {if (error.response) {// 请求成功但状态码不在 2xx 范围console.log(error.response.data);console.l…

学习JavaEE的日子 Day33 File类,IO流

Day33 1.File类 File是文件和目录路径名的抽象表示 File类的对象可以表示文件&#xff1a;C:\Users\Desktop\hhy.txt File类的对象可以表示目录路径名&#xff1a;C:\Users\Desktop File只关注文件本身的信息&#xff08;文件名、是否可读、是否可写…&#xff09;&#xff0c…

【前缀积】Leetcode 除自身以外数组的乘积

题目解析 238. 除自身以外数组的乘积 算法讲解 我们可以使用两个空间保存当前位置的左边积和右边积&#xff0c;需要注意的地方初始的dp表需要初始化为1&#xff0c;如果是0则无法得到结果&#xff0c;因为此处是乘法 class Solution { public:vector<int> productEx…

LLM 推理优化探微 (4) :模型性能瓶颈分类及优化策略

编者按&#xff1a; 在人工智能浪潮袭卷全球的大背景下&#xff0c;进一步提升人工智能模型性能&#xff0c;满足更多应用需求已经刻不容缓。如何优化模型延迟和吞吐量&#xff0c;成为了业界亟待解决的重要问题。 我们今天为大家带来的这篇文章&#xff0c;其观点为&#xff1…

【考研数学】零基础全年保底计划+资料分享

数二90现在真的不提啊够用了&#xff01;零基础或者基础差的&#xff0c;听我的&#xff0c;大胆一点&#xff0c;咱们定120的目标&#xff01; 不要因为自己基础不好什么的没自信...现在意识到问题是来得及解决的 本人属于基础很差相当于是零基础的23考研党&#xff0c;经过…

-bash: wget: command not found

1、-bash: wget: command not found 如下图 2、解决办法 yum -y install wget

牛客NC413 两个升序数组的中位数【hard 数组,模拟 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/b3b59248e61f499482eaba636305474b 思路 直接模拟2个数组有顺序放到一个数组中help中如果help长度为奇数&#xff0c;返回中间的数如果help长度为偶数&#xff0c;返回中间2个数的和除以2参考答案java import j…

Web程序设计-实验01 HTML与CSS基础

【实验主题】 影视详情页设计 【实验任务】 1、浏览并分析多个影视详情页面&#xff08;详见参考资源&#xff0c;建议自行搜索更多影视网站&#xff09;的主要元素构成和版面设计&#xff0c;借鉴并构思预期效果。 2、新建 index.html文件&#xff0c;合理运用HTML标记编写…