LeetCode刷题笔记之动态规划(三)
一、子序列/子数组问题
子序列:按原数组的顺序排列,不一定是原数组中的相邻元素组成的。即子序列可以是不连续的。
子数组:原数组中连续的几个元素组成的数组。
1. 300【最长递增子序列】
- 题目:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 - 代码:
class Solution {public int lengthOfLIS(int[] nums) {//dp表示以数组中第i个元素为结尾的最长严格递增子序列的长度//dp[i] = max(dp[j])+1,其中nums[j]是nums[i]左边小于nums[i]的元素//dp[0] = 1int[] dp = new int [nums.length];dp[0] = 1;int max = 1;for(int i=1;i<nums.length;i++){int tmp = 0;for(int j=0;j<i;j++){if(nums[j]<nums[i]){tmp = Math.max(tmp,dp[j]);}}dp[i] = tmp + 1;max = Math.max(dp[i],max);}return max;}
}
2. 72【编辑距离】
- 题目: 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:- 插入一个字符
- 删除一个字符
- 替换一个字符
- 代码:
class Solution {public int minDistance(String word1, String word2) {//两个字符串的操作,使用双指针,i指向word1,j指向word2//dp[i][j]表示由左向右操作到word1的第i个位置,word2的第j个位置需要的最少操作数。//dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1)//dp[0][j] = j,dp[i][0] = iint m = word1.length();int n = word2.length();if(n==0) return m;if(m==0) return n;int[][] dp = new int [m+1][n+1];for(int i=0;i<=m;i++){dp[i][0] = i;}for(int i=0;i<=n;i++){dp[0][i] = i;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(word1.charAt(i-1)==word2.charAt(j-1)){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = minDp(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;}}}return dp[m][n];}public int minDp(int a,int b,int c){int tmp = Math.min(a,b);tmp = Math.min(tmp,c);return tmp;}
}
3. 53【最大子数组的和】
- 题目: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。 - 代码:
class Solution {public int maxSubArray(int[] nums) {//dp[i]表示以nums[i]为结尾的最大子数组的和//dp[i] = max(dp[i-1]+nums[i],nums[i])//dp[0] = nums[0]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(dp[i-1]+nums[i],nums[i]);max = Math.max(dp[i],max);}return max;}
}
4. 674【最长连续自增序列】
- 题目: 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。 - 代码:
//方法一:双指针
class Solution {public int findLengthOfLCIS(int[] nums) {//双指针法,固定左指针,移动右指针,//直到右指针所指元素不满足条件,将左指针指向右指针int i=0;int max = 1;for(int j=1;j<nums.length;j++){if(nums[j-1]<nums[j]){max = Math.max(max,j-i+1);}else{i = j;}}return max;}
}
//方法二:动态规划
class Solution {public int findLengthOfLCIS(int[] nums) {//dp[i]表示以第i个元素结尾的最长连续递增子序列的长度//dp[i]=1 or dp[i-1]+1//dp[0]=1int[] dp = new int[nums.length];dp[0] = 1;int max=1;for(int i=1;i<nums.length;i++){if(nums[i-1]<nums[i]){dp[i] = dp[i-1]+1;}else{dp[i] = 1;}max = Math.max(max,dp[i]);}return max;}
}
5. 718【最长重复子数组】
- 题目: 给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度。
- 代码:
class Solution {public int findLength(int[] nums1, int[] nums2) {//dp[i][j]表示以nums1[i],nums2[j]结尾的最长的公共子数组长度//dp[i][j] = dp[i-1][j-1]+1 (nums1[i]==nums2[j])//dp[0][0] = 0(nums1[i-1]!=nums2[j-1]) or 1(nums1[i-1]==nums2[j-1])int n = nums1.length;int m = nums2.length;int[][] dp = new int[n][m];int max=0;for(int i=0;i<n;i++){if(nums1[i]!=nums2[0]){dp[i][0] = 0;}else{dp[i][0] = 1;}max = Math.max(dp[i][0],max);}for(int i=0;i<m;i++){if(nums1[0]!=nums2[i]){dp[0][i] = 0;}else{dp[0][i] = 1;}max = Math.max(dp[0][i],max);}for(int i=1;i<n;i++){for(int j=1;j<m;j++){if(nums1[i] == nums2[j]){dp[i][j] = dp[i-1][j-1]+1;}else{dp[i][j] = 0;}max = Math.max(dp[i][j],max);}}return max;}
}
6. 1143【最长公共子序列】
- 题目: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 - 代码:
class Solution {public int longestCommonSubsequence(String text1, String text2) {//dp[i][j]表示以text1[i],text2[j]为结尾的最长公共子序列长度//dp[i][j] = dp[i-1][j-1]+1(text1[i]==text2[j]) or//dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])//dp[i][0] = 0(text1[0]!=text2[0]) or 1(text1[0]==text2[0])//dp[0][i] = 0(text1[0]!=text2[0]) or 1(text1[0]==text2[0])int n = text1.length();int m = text2.length();int[][] dp = new int[n][m];boolean flag = false;for(int i=0;i<n;i++){if((text1.charAt(i) == text2.charAt(0))||flag==true){dp[i][0] = 1;flag = true;}else {dp[i][0] = 0;}}int max=0;if(flag){max = 1;}flag = false;for(int i=0;i<m;i++){if((text1.charAt(0)==text2.charAt(i))||flag==true){dp[0][i] = 1;flag = true;}else{dp[0][i] = 0;} }for(int i=1;i<n;i++){for(int j=1;j<m;j++){if(text1.charAt(i) == text2.charAt(j)){dp[i][j] = dp[i-1][j-1]+1;}else{dp[i][j] = maxNum(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]);}max = Math.max(max,dp[i][j]);}}return max;}public int maxNum(int a,int b,int c){int tmp = Math.max(a,b);return Math.max(tmp,c);}
}
7. 647【回文子串】
- 题目: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
- 代码:
class Solution {public int countSubstrings(String s) {//dp[i][j]表示在substring(i,j+1)是否是回文串//dp[i][j] = true(s[i]==s[j]) or false(s[i]!=s[j])//因为i由i+1决定,j由j-1决定,所以需要从左下角开始遍历//dp[][0]=false or true,dp[n-1][]=false or trueint n = s.length();boolean[][] dp = new boolean[n][n];int ans = 0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s.charAt(i)==s.charAt(j)){if(j-i<=1){dp[i][j] = true;ans++;}else if(dp[i+1][j-1]){dp[i][j] = true;ans++;}}}}return ans;}
}
8. 5【最长回文子串】
- 题目: 给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 - 代码:
class Solution {public String longestPalindrome(String s) {//dp[i][j]表示substring(i,j+1)是否是回文串//dp[i][j] = true(s[i]==s[j]) or false(s[i]!=s[j])//dp[i][j] = true(s[i]==s[j] and j-i<=1 or dp[i+1][j-1])int n = s.length();boolean[][] dp = new boolean[n][n];int maxLen = 0;int index = 0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s.charAt(i) == s.charAt(j)){if(j-i<=1){dp[i][j] = true;}else if(dp[i+1][j-1]){dp[i][j] = true;}if(dp[i][j] && (maxLen < j-i+1)){maxLen = j-i+1;index = i;}}}}return s.substring(index,index+maxLen);}
}
相关文章:
LeetCode刷题笔记之动态规划(三)
一、子序列/子数组问题 子序列:按原数组的顺序排列,不一定是原数组中的相邻元素组成的。即子序列可以是不连续的。 子数组:原数组中连续的几个元素组成的数组。 1. 300【最长递增子序列】 题目: 给你一个整数数组 nums ÿ…...

Unity编辑器功能将AB资源文件生成MD5码
将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗,通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码...

【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)
问题描述: 需要使用当前时间、日期,可以使用 SQL 中的 CURDATE() 、NOW()、CURTIME()运算符 案例: INSERT INTO table_name(current_time, column_name2,...) VALUES (NOW(),, ...)规则(Date 相关函数): 规则(Date数据类型)...
什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题?
什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题? 以下代码就是一个回调函数的例子: ajax(url, () > {// 处理逻辑 })回调函数有一个致命的弱点,就是容易写出回调地狱(Callback hell࿰…...

如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问
最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可…...
智能写作利器ChatGPT:提升论文写作效率
ChatGPT无限次数:点击直达 智能写作利器ChatGPT:提升论文写作效率 在当今信息爆炸的时代,快速高效地撰写论文对于科研工作者来说至关重要。智能写作工具ChatGPT的出现为我们提供了强大的支持,它不仅能够提升论文写作的效率,还能够…...

【iOS ARKit】3D文字
首先,3D场景中渲染的任何虚拟元素都必须具有网格(顶点及顶点间的拓扑关系),没有网格的元素无法利用GPU 进行渲染,因此,在3D 场景申渲染 3D文字时,文字也必须具有网格。在计算机系统中࿰…...

第二百二十八回
文章目录 1. 概念介绍2. 修改方法2.1 修改形状2.2 修改颜色2.3 修改位置 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何创建以图片为背景的页面"相关的内容,本章回中将介绍如何修改按钮的形状.闲话休提,让我们一起Talk Flutter吧。 1. …...

Java设计模式之单例模式(多种实现方式)
虽然写了很多年代码,但是说真的对设计模式不是很熟练,虽然平时也会用到一些,但是都没有深入研究过,所以趁现在有空练下手 这章主要讲单例模式,也是最简单的一种模式,但是因为spring中bean的广泛应用&#…...
Miracast投屏探索
Miracast是一种Wi-Fi Alliance推出的无线显示技术,允许在支持Miracast标准的设备之间进行屏幕镜像和内容共享。在Miracast技术中,通常会涉及到两种角色:Source(发送端)和Sink(接收端)。 Source&…...

2024年幻兽帕鲁服务器优惠价格表手动整理,最全报价
2024年全网最全的幻兽帕鲁服务器租用价格表,阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月,阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全: 阿里云幻…...
使用Python自动备份重要文件:一步一步的教程
目录 1 重要性说明1.1 数据丢失的风险1.2 自动化备份的好处1.3 提高数据安全性和恢复力 2 工具和技术简介2.1 os库2.2 shutil库2.3 glob库2.4 pathlib库 3 备份策略设计3.1 全备份3.2 增量备份3.3 差异备份3.4 根据需求选择备份策略 4 编写备份脚本4.1 步骤拆解步骤 1: 选择源文…...
python学习
Python面试题大全 - 50道经典面试题 - 掘金 yoloV5:yolov5: YOLOv5 汉化版,保持官方同步更新 yoloV8使用案例:用YOLOv8一站式解决图像分类、检测、分割…… - 掘金 yoloV8使用案例douyin:https://www.douyin.com/user/self?modal_id7276287878194285…...

【使用redisson完成延迟队列的功能】使用redisson配合线程池完成异步执行功能,延迟队列和不需要延迟的队列
1. 使用redisson完成延迟队列的功能 引入依赖 spring-boot-starter-actuator是Spring Boot提供的一个用于监控和管理应用程序的模块 用于查看应用程序的健康状况、审计信息、指标和其他有用的信息。这些端点可以帮助你监控应用程序的运行状态、性能指标和健康状况。 已经有了…...
Linux 性能分析工具 perf 的使用指南
什么是perf,可以用来干什么 perf 是 Linux 内核的性能分析工具集,它可以用来监控和分析系统和应用程序的性能。perf 提供了一系列功能强大的子命令,可以帮助开发者和系统管理员: 监控 CPU 使用率:识别最消耗 CPU 的代…...

【QT入门】 Qt代码创建布局之水平布局、竖直布局详解
往期回顾: 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号-CSDN博客 【QT入门】 Qt内存管理机制详解-CSDN博客 【QT入门】 Qt代码创建布局之水平布局、竖直布局详解 先看两个问题: 1、ui设计器设计界面很方便…...
C 传递数组给函数
如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。 方式 1…...

二次开发Flink-coGroup算子支持迟到数据通过测输出流提取
目录 1.背景 2.coGroup算子源码分析 2.1完整的coGroup算子调用流程 2.2coGroup方法入口 2.3 CoGroupedStreams对象分析 2.4WithWindow内部类分析 2.5CoGroupWindowFunction函数分析 3.修改源码支持获取迟到数据测输出流 3.1复制CoGroupedStreams 3.2新增WithWindow.si…...

【容器源码篇】Set容器(HashSet,LinkedHashSet,TreeSet的特点)
文章目录 ⭐容器继承关系🌹Set容器🗒️HashSet源码解析构造方法public HashSet()public HashSet(Collection<? extends E> c)public HashSet(int initialCapacity, float loadFactor)HashSet(int initialCapacity, float loadFactor, boolean dum…...

网络工程师实验命令(华为数通HCIA)
VRP系统的基本操作 dis version #查看设备版本信息 sys #进入系统视图 system-name R1 #改设备名字为R1进入接口配置IP地址 int g0/0/0 ip address 192.168.1.1 255.255.255.0 #配置接口地址为192.168.1.1/255.255.255.0 ip address 192.168.1.2 24 sub #此…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...