力扣爆刷第80天--动态规划一网打尽子序列一维二维连续不连续变体

力扣爆刷第80天–动态规划一网打尽子序列一维二维连续不连续变体

文章目录

      • 力扣爆刷第80天--动态规划一网打尽子序列一维二维连续不连续变体
      • 零、总结
      • 一、1035.不相交的线
      • 二、53. 最大子序和
      • 三、392.判断子序列
      • 四、115.不同的子序列

零、总结

今天也是子序列的一天,但和上一期不同的是都是变体,也分为一维、二维、连续、非连续四种题型。
另外就是做子序列相关的题目一定要考虑好定义以后就使用实例自己推导一下,把结果展现出来,然后再看看能否推导出递推公式或者看看递推公式是否匹配。

一、1035.不相交的线

题目链接:https://leetcode.cn/problems/uncrossed-lines/description/
思路:本题不相交的线其实是求最长重复子序列,只是把题目的问法稍微改动了一点,但本质没有变,子序列具体的四种类型上一期有讲,本期不再赘述。
定义dp[i][j]表示区间nums1[0, i]和区间nums2[0, j]中以nums1[i]和nums2[j]为结尾的最长重复子序列的长度,那么如果nums1[i]==num2s[j],dp[i][j]自然可以从dp[i-1][j-1]推出,为dp[i][j] = dp[i-1][j-1] + 1;
如果nums1[i] != num2s[j],那么最长的长度要延续之前的长度,dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);

class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int[][] dp = new int[nums1.length+1][nums2.length+1];for(int i = 1; i <= nums1.length; i++) {for(int j = 1; j <= nums2.length; 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[nums1.length][nums2.length];}
}

二、53. 最大子序和

题目链接:https://leetcode.cn/problems/maximum-subarray/
思路:本题求的是最大和的连续子数组,是一维的,和上一期中的最长连续递增子序列是一类题目,只不过算个变体,改变了问法,但解题的方法没有变,依然是定义dp[i]表示为nums[0, i]中以nums[i]为结尾的连续子数组的最大和,那么对于每一个元素来说,是否加到上一个连续子数组的结尾,取决于加上后,和的值是否变大,不变大就另起炉灶,由此可以得到递推公式:dp[i] = Math.max(nums[i], dp[i-1]+nums[i]);

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

贪心:
另外本题使用贪心也可以做,求最大连续子数组的和,只要连续子数组的和大于0,就可以相加,如果小于0,便新开一个子数组。

class Solution {public int maxSubArray(int[] nums) {int sum = 0, max = Integer.MIN_VALUE;for(int i = 0; i < nums.length; i++) {sum += nums[i];max = Math.max(sum, max);if(sum < 0) {sum = 0;}}return max;}
}

三、392.判断子序列

题目链接:https://leetcode.cn/problems/is-subsequence/
思路:本题是判断s是否是t的子序列,那么也有是一个变体,即s是连续,t非连续,上一期的是s与t都连续,或者都不连续,且看本题如何解决。
定义dp[i][j]表示,s[0, i] 和 t[0, j]中以s[i]为结尾,且以t[j]为结尾,是否为其子序列,如果s[i]==t[j]根据定义,延续dp[i-1][j-1]的状态,如果s[i] != t[j],应该延续,s[i]与t[j-1]的状态,如s = “b”, t = “abc” , 求dp[1][3],b与c不等,应该继承 “b” 与 "ab"的状态。

class Solution {public boolean isSubsequence(String s, String t) {if(s.length() > t.length()) return false;if(s.length() == 0) return true;boolean[][] dp = new boolean[s.length()+1][t.length()+1];Arrays.fill(dp[0], true);for(int i = 1; i <= s.length(); i++) {for(int j = 1; j <= t.length(); j++) {if(s.charAt(i-1) == t.charAt(j-1)) {dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = dp[i][j-1];}}}return dp[s.length()][t.length()];}
}

双指针:
下面的写法丑陋了一些,但也是双指针,调整了t的遍历位置。

class Solution {public boolean isSubsequence(String s, String t) {int len = 0, k = 0;for(int i = 0; i < s.length(); i++) {for(int j = k; j < t.length(); j++) {if(s.charAt(i) == t.charAt(j)) {len++;k = j+1;break;}}}return len == s.length();}
}

四、115.不同的子序列

题目链接:https://leetcode.cn/problems/distinct-subsequences/
思路:本题也是变体,s不连续,t连续,和上一题是类似的,但是求的目标变成了组合数,依然定义为dp[i][j]表示为s[0, i]和t[0, j]以s[i]和t[j]为结尾,t出现在s中的组合数,那么当s[i]==t[j]时,不光可以记录下s[i-1]和t[j-1]的组合数,也可以记录下s[i-1]和t[j]的组合数,不等时,只需要记录s[i-1]与t[j]的组合数,具体可以简单推导一下。

class Solution {public int numDistinct(String s, String t) {int[][] dp = new int[s.length()+1][t.length()+1];for(int i = 0; i < s.length(); i++) {dp[i][0] = 1;}for(int i = 1; i <= s.length(); i++) {for(int j = 1; j <= t.length(); j++) {if(s.charAt(i-1) == t.charAt(j-1)) {dp[i][j] = dp[i-1][j-1] + dp[i-1][j];}else {dp[i][j] = dp[i-1][j];}}}return dp[s.length()][t.length()];}
}

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

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

相关文章

NLP 使用Word2vec实现文本分类

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/…

【算法小讲堂】#1 贪心算法

引入——关于贪心算法 我们先来做一个小游戏——现在假设自己是一个小偷&#xff0c;桌上有一些物品&#xff0c;包括一台iPhone15、一个充电宝、一个眼罩和一个溜溜梅。此时&#xff0c;你听说警察即将到来&#xff0c;那么你会先带走哪个东西呢&#xff1f; 一般来讲&#xf…

「Python系列」Python JSON数据解析

文章目录 一、JSON数据解析1. 读取和解析JSON文件2. 字符串到Python对象的解析3. Python对象到JSON字符串的转换4. 错误处理5. JSON数据的格式化输出 二、Python 编码为 JSON 类型转换对应表三、JSON简介四、相关链接 一、JSON数据解析 在Python中解析JSON数据通常使用json模块…

VUE中引入外部jquery.min.js文件

jquery官网&#xff1a;https://jquery.com/ cdn链接&#xff1a;https://code.jquery.com/jquery-3.7.1.js <template><div class"">测试jq<div id"jq">这是一个盒子</div></div> </template><script> import…

再次委托|工科背景老师赴美国斯坦福大学自费访学

工科背景的I老师&#xff0c;几年前曾通过我们获得美国哈佛大学医学院的无薪博士后职位&#xff0c;从事医工交叉学科研究。回国完成2年服务期后&#xff0c;I老师再次委托并仍希望去美国顶尖高校&#xff0c;最终我们落实了世界名校斯坦福大学的访问学者职位&#xff0c;满足了…

网络安全的重要性及SASE在企业中的应用

在信息技术日益发展的今天&#xff0c;网络安全已经成为企业不可忽视的重要议题。然而&#xff0c;仍有部分企业对网络安全的重视程度不够&#xff0c;这种疏忽可能会给企业带来严重的后果。 1. 数据泄露的风险 数据是现代企业的核心资产之一。如果企业不重视网络安全&#x…

跨境外贸自动评论脚本开发常用代码!

随着跨境电商的兴起&#xff0c;自动化评论成为了提升销售和客户满意度的重要工具&#xff0c;通过编写自动评论脚本&#xff0c;商家可以快速地在各个平台留下正面评价&#xff0c;提高产品的曝光率和信誉度。 本文将介绍跨境外贸自动评论脚本开发的一些常用代码&#xff0c;…

RabbitMq:RabbitMq 主从镜像模式②

一、模式思想 所有的技术设计思想&#xff0c;基本都在两点上下功夫&#xff1a;1. 生产力上 2. 稳定性上 二、集群模式 今天又有人问起来rabbitmq的高可用方式&#xff0c;因为和常见的主从模式有点区别&#xff0c;所以就记录一下。 rabbitmq集群的镜像队列提供了更高级的主…

【前沿热点视觉算法】-视觉识别的统一卷积和自我注意

计算机视觉算法分享。问题或建议&#xff0c;请文章私信或者文章末尾扫码加微信留言。 1 论文题目 视觉识别的统一卷积和自我注意 2 论文摘要 由于大量的局部冗余和复杂的全局依赖性&#xff0c;从图像和视频中学习区别表示是一项具有挑战性的任务。卷积神经网络&#xff08…

算法沉淀——动态规划之路径问题(leetcode真题剖析)

算法沉淀——动态规划之路径问题 01.不同路径02.不同路径 II03.珠宝的最高价值04.下降路径最小和05.最小路径和06.地下城游戏 01.不同路径 题目链接&#xff1a;https://leetcode.cn/problems/unique-paths/ 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图…

SpringMVC 学习(七)之报文信息转换器 HttpMessageConverter

目录 1 HttpMessageConverter 介绍 2 RequestBody 注解 3 ResponseBody 注解 4 RequestEntity 5 ResponseEntity 6 RestController 注解 1 HttpMessageConverter 介绍 HttpMessageConverter 报文信息转换器&#xff0c;将请求报文&#xff08;如JSON、XML、HTML等&#x…

【HarmonyOS】鸿蒙开发之Stage模型-应用配置文件——第4.2章

Stage模型-应用配置文件 AppScope -> app.json5&#xff1a;应用的全局配置信息entry&#xff1a;OpenHarmony工程模块&#xff0c;编译构建生成一个HAP包 build&#xff1a;用于存放OpenHarmony编译生成的hap包src -> main -> ets&#xff1a;用于存放ArkTS源码src …

每日一题——LeetCode1512.好数对的数目

方法一 暴力循环 var numIdenticalPairs function(nums) {let ans 0;for (let i 0; i < nums.length; i) {for (let j i 1; j < nums.length; j) {if (nums[i] nums[j]) {ans;}}}return ans; }; 消耗时间和内存情况&#xff1a; 方法二&#xff1a;组合计数 var …

msvcr110.dll找不到怎么修复?多种解决msvcr110.dll缺失方法分析

面对如“程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll”这样的错误提示时&#xff0c;你的日常工作或游戏娱乐很可能会被迫暂停。这种问题在Windows用户中相当普遍&#xff0c;它们来源于某些共享的系统文件缺失。不过&#xff0c;好消息是解决此类错误通常并非困难任务…

SpringCloud Alibaba 2022之Nacos学习

SpringCloud Alibaba 2022使用 SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本&#xff0c;同时JDK需要是17及以上的版本。具体的可以看官网的说明。 Spring Cloud Alibaba版本说明 环境搭建 这里搭建的是一个聚合项目。项目结构如下&#xff1a; 父项目的pom.xm…

防御保护第六次作业整理笔记

DPI DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#xff08;应用层&#xff09; 1&#xff0c;基于“特征字”的检测技术 --- 最常用的识别手段&#xff0c;基于…

Springboot--整合定时任务quartz--集群篇

文章目录 前言一、quartz 的集群&#xff1a;1.1 服务集群带来的定时任务问题&#xff1a;1.2 服务集群定时任务解决思路&#xff1a; 二、quartz 集群实现&#xff1a;2.1 引入jar2.2 配置文件&#xff1a;2.3 定义quartz 数据源&#xff1a;2.4 集群测试&#xff1a;2.4.1 定…

【管理咨询宝藏资料25】某能源集团五年发展战略报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料25】某能源集团五年发展战略报告 【关键词】战略规划、五年战略、管理咨询 【文件核心观点】 - LL应以快速做大做强为目标&#xff0c;专注…

百能正式加入星闪联盟,助力无线通信技术发展

星闪联盟于2020年9月22日正式成立&#xff0c;是一个由国家级标准研究机构、行业领军企业、产业链合作伙伴等组成的开放式合作平台。该联盟致力于推动新一代无线短距通信技术SparkLink的创新和产业生态发展&#xff0c;以满足智能汽车、智能家居、智能终端和智能制造等快速发展…

Escalate_Linux-环境变量劫持提权(5)

环境变量劫持提权 在Shll输入命令时&#xff0c;Shel会按PAH环境变量中的路径依次搜索命令&#xff0c;若是存在同名的命令&#xff0c;则执行最先找到的&#xff0c;若是PATH中加入了当前目录&#xff0c;也就是“”这个符号&#xff0c;则可能会被黑客利用&#xff0c;例如在…