力扣热题 100:多维动态规划专题经典题解析
系列文章目录
力扣热题 100:哈希专题三道题详细解析(JAVA)
力扣热题 100:双指针专题四道题详细解析(JAVA)
力扣热题 100:滑动窗口专题两道题详细解析(JAVA)
力扣热题 100:子串专题三道题详细解析(JAVA)
力扣热题 100:普通数组专题五道题详细解析(JAVA)
力扣热题 100:矩阵专题四道题详细解析(JAVA)
力扣热题 100:链表专题经典题解析(前7道)
力扣热题 100:链表专题经典题解析(后7道)
力扣热题 100:二叉树专题经典题解析(前8道)
力扣热题 100:二叉树专题进阶题解析(后7道)
力扣热题 100:图论专题经典题解析
力扣热题 100:回溯专题经典题解析
力扣热题 100:二分查找专题经典题解析
力扣热题 100:栈专题经典题解析
力扣热题 100:堆专题经典题解析
力扣热题 100:贪心算法专题经典题解析
力扣热题 100:动态规划专题经典题解析
力扣热题 100:多维动态规划专题经典题解析
力扣热题 100:技巧专题经典题解析
文章目录
- 系列文章目录
- 一、不同路径(题目 62)
- 1. 题目描述
- 2. 示例
- 3. 解题思路
- 4. 代码实现(Java)
- 5. 复杂度分析
- 二、最小路径和(题目 64)
- 1. 题目描述
- 2. 示例
- 3. 解题思路
- 4. 代码实现(Java)
- 5. 复杂度分析
- 三、最长回文子串(题目 5)
- 1. 题目描述
- 2. 示例
- 3. 解题思路
- 4. 代码实现(Java)
- 5. 复杂度分析
- 四、最长公共子序列(题目 1143)
- 1. 题目描述
- 2. 示例
- 3. 解题思路
- 4. 代码实现(Java)
- 5. 复杂度分析
- 五、编辑距离(题目 72)
- 1. 题目描述
- 2. 示例
- 3. 解题思路
- 4. 代码实现(Java)
- 5. 复杂度分析
在力扣(LeetCode)平台上,多维动态规划相关的题目是算法面试和练习中的重要部分。今天,我们就来详细解析多维动态规划专题中的几道经典题目,帮助大家更好地理解解题思路和技巧。
一、不同路径(题目 62)
1. 题目描述
一个机器人位于一个 m x n 网格的左上角,只能向下或向右移动,求到达右下角的不同路径数。
2. 示例
示例 1:
输入:m = 3, n = 2
输出:3
3. 解题思路
这道题主要考察二维动态规划的应用。我们可以使用一个二维数组 dp,其中 dp[i][j] 表示到达位置 (i, j) 的不同路径数。状态转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1]。
4. 代码实现(Java)
public class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int j = 0; j < n; j++) {dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m-1][n-1];}
}
5. 复杂度分析
- 时间复杂度 :O(m * n),需要遍历整个网格。
- 空间复杂度 :O(m * n),需要使用二维数组存储路径数。可以优化为 O(n) 空间,使用一维数组滚动更新。
二、最小路径和(题目 64)
1. 题目描述
给定一个 m x n 的网格 grid,其中每个单元格包含一个非负整数,求从左上角到右下角的最小路径和。
2. 示例
示例 1:
输入:grid = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
输出:7
3. 解题思路
这道题主要考察二维动态规划的应用。我们可以使用一个二维数组 dp,其中 dp[i][j] 表示到达位置 (i, j) 的最小路径和。状态转移方程为 dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1])。
4. 代码实现(Java)
public class Solution {public int minPathSum(int[][] grid) {int m = grid.length;int n = grid[0].length;int[][] dp = new int[m][n];dp[0][0] = grid[0][0];for (int i = 1; i < m; i++) {dp[i][0] = dp[i-1][0] + grid[i][0];}for (int j = 1; j < n; j++) {dp[0][j] = dp[0][j-1] + grid[0][j];}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1]);}}return dp[m-1][n-1];}
}
5. 复杂度分析
- 时间复杂度 :O(m * n),需要遍历整个网格。
- 空间复杂度 :O(m * n),需要使用二维数组存储路径和。可以优化为 O(n) 空间,使用一维数组滚动更新。
三、最长回文子串(题目 5)
1. 题目描述
给定一个字符串 s,找到其中最长的回文子串。
2. 示例
示例 1:
输入:s = "babad"
输出:"bab"
3. 解题思路
这道题主要考察二维动态规划的应用。我们可以使用一个二维数组 dp,其中 dp[i][j] 表示子串 s[i..j] 是否为回文子串。状态转移方程为 dp[i][j] = (s[i] == s[j]) && dp[i+1][j-1]。
4. 代码实现(Java)
public class Solution {public String longestPalindrome(String s) {int n = s.length();boolean[][] dp = new boolean[n][n];String result = "";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 {dp[i][j] = dp[i+1][j-1];}if (dp[i][j] && j - i + 1 > result.length()) {result = s.substring(i, j + 1);}}}}return result;}
}
5. 复杂度分析
- 时间复杂度 :O(n^2),需要遍历所有可能的子串。
- 空间复杂度 :O(n^2),需要使用二维数组存储回文状态。
四、最长公共子序列(题目 1143)
1. 题目描述
给定两个字符串 text1 和 text2,求它们的最长公共子序列的长度。
2. 示例
示例 1:
输入:text1 = "abcde", text2 = "ace"
输出:3
3. 解题思路
这道题主要考察二维动态规划的应用。我们可以使用一个二维数组 dp,其中 dp[i][j] 表示 text1 的前 i 个字符和 text2 的前 j 个字符的最长公共子序列长度。状态转移方程为:
- 如果
text1[i-1] == text2[j-1],则dp[i][j] = dp[i-1][j-1] + 1。 - 否则,
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])。
4. 代码实现(Java)
public class Solution {public int longestCommonSubsequence(String text1, String text2) {int m = text1.length();int n = text2.length();int[][] dp = new int[m+1][n+1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; 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[m][n];}
}
5. 复杂度分析
- 时间复杂度 :O(m * n),需要遍历两个字符串的所有字符组合。
- 空间复杂度 :O(m * n),需要使用二维数组存储最长公共子序列长度。可以优化为 O(min(m, n)) 空间,使用一维数组滚动更新。
五、编辑距离(题目 72)
1. 题目描述
给定两个字符串 word1 和 word2,求将 word1 转换为 word2 所需的最少操作数。允许的操作包括插入、删除和替换。
2. 示例
示例 1:
输入:word1 = "horse", word2 = "ros"
输出:3
3. 解题思路
这道题主要考察二维动态规划的应用。我们可以使用一个二维数组 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最少操作数。状态转移方程为:
- 如果
word1[i-1] == word2[j-1],则dp[i][j] = dp[i-1][j-1]。 - 否则,
dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])。
4. 代码实现(Java)
public class Solution {public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();int[][] dp = new int[m+1][n+1];for (int i = 0; i <= m; i++) {dp[i][0] = i;}for (int j = 0; j <= n; j++) {dp[0][j] = j;}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] = 1 + Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]);}}}return dp[m][n];}
}
5. 复杂度分析
- 时间复杂度 :O(m * n),需要遍历两个字符串的所有字符组合。
- 空间复杂度 :O(m * n),需要使用二维数组存储操作数。可以优化为 O(min(m, n)) 空间,使用一维数组滚动更新。
以上就是力扣热题 100 中与多维动态规划相关的经典题目的详细解析,希望对大家有所帮助。在实际刷题过程中,建议大家多动手实践,理解解题思路的本质,这样才能更好地应对各种算法问题。
相关文章:
力扣热题 100:多维动态规划专题经典题解析
系列文章目录 力扣热题 100:哈希专题三道题详细解析(JAVA) 力扣热题 100:双指针专题四道题详细解析(JAVA) 力扣热题 100:滑动窗口专题两道题详细解析(JAVA) 力扣热题 100:子串专题三道题详细解析(JAVA) 力…...
【Unity】在项目中使用VisualScripting
1. 在packagemanager添加插件 2. 在设置中进行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …...
Pytest自动化测试框架pytest-xdist分布式测试插件
平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完; 当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间缩短一…...
文件解析漏洞靶场解析全集详解
lls解析漏洞 目录解析 在网站的下面将一个1.asp文件夹,在里面建一个2.txt文件在里面写入<% -now()%>这个显示时间的代码,再将文件名改为2.jpg。 发现2.jpg文件以asp形式执行 畸形文件解析 将2.jpg文件移到网站的下面与1.asp并列,将名…...
C语言数据结构:数组
1. 数组(Array) 1.1 定义 数组是一种线性数据结构,由相同类型的元素组成,这些元素在内存中按顺序存储。数组的大小在声明时确定,且不可动态改变。 1.2 类型细分 根据维度和用途,数组可以分为以下几种类型…...
LeetCode-移动零
一、题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums […...
PDF Reader
Acrobat Reader...
孔夫子根剧关键字获取在售商品 API
要使用孔夫子旧书网根据关键字获取在售商品的 API,需要以下步骤1: 注册与认证:在孔夫子旧书网的开发者平台注册一个账号,登录后创建一个新的应用,以获取 API 密钥(key)和调用密钥(s…...
Qt的QToolButton设置弹出QMenu下拉菜单
在Qt中,使用QToolButton显示下拉菜单可以通过以下步骤实现: 基本实现步骤 创建QToolButton:实例化一个QToolButton对象。创建QMenu:实例化一个QMenu作为下拉菜单。添加菜单项:通过QMenu::addAction方法添加动作&…...
【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板
【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板 零、安装清单一、安装Docker Desktop软件1.1 安装前<启用或关闭Windows功能> 中的描红的三项1.2 查看软件版本1.3 配置Docker镜像 二、更新装Docker Desktop三、安装 k8s3.1 点击启动安装3.2 查看状态3.3 查…...
Elasticsearch Java High Level Client [7.17] 使用
es 的 HighLevelClient存在es源代码的引用,结合springboot使用时,会存在es版本的冲突,这里记录下解决冲突和使用方式(es已经不建议使用这个了)。 注意es服务端的版本需要与client的版本对齐,否则返回数据可…...
Vue项目搜索引擎优化(SEO)终极指南:从原理到实战
文章目录 1. SEO基础与Vue项目的挑战1.1 为什么Vue项目需要特殊SEO处理?1.2 搜索引擎爬虫工作原理 2. 服务端渲染(SSR)解决方案2.1 Nuxt.js框架实战原理代码实现流程图 2.2 自定义SSR实现 3. 静态站点生成(SSG)技术3.1…...
LeetCode:93. 复原 IP 地址(DFS Java)
目录 93. 复原 IP 地址 题目描述: 实现代码与解析: DFS 原理思路: 93. 复原 IP 地址 题目描述: 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0)…...
Spring Boot 中实现全局 Token 验证的两种方式
文章目录 学习文章:Spring Boot 中实现全局 Token 验证的两种方式 一、为什么需要全局 Token 验证?二、使用拦截器实现全局 Token 验证1. 创建 Token 验证拦截器2. 注册拦截器3. 测试拦截器 三、使用过滤器实现全局 Token 验证1. 创建 Token 验证过滤器2…...
【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)
本篇文章主要包含Jmeter的下载安装、环境配置 添加线程组、结果树、HTTP请求、请求头设置。JSON提取器的使用,用户自定义变量 目录 一:引入 1:软件介绍 2:工作原理 3:安装Jmeter 4:启动方式 …...
【Matlab仿真】如何解决三相交流信号源输出波形失真问题?
问题描述 如标题所示,在搭建simulink模型过程中,明明模型搭建的没有问题,但是输出的波形却不是理想的正弦波,影响问题分析。 问题分析 以三相交流信号源输出波形为例,输出信号理应为三相正弦量,但是仿真…...
Fiora聊天系统本地化部署:Docker搭建与远程在线聊天的实践指南
文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 这个通讯软件泛滥的时代,每天都在刷着同样的朋友圈、看着千篇一律的表情包,是不是觉得有点腻了&#…...
metersphere接口测试(1)使用MeterSphere进行接口测试
文章目录 前言接口文档单接口测试环境配置梳理接口测试场景测试接口 接口自动化怎么写复用性高的自动化测试用例 总结 前言 大汉堡工作第203天,本篇记录我第一次接触接口测试任务,最近有些懈怠啊~ 接口文档 首先就是接口地址,接口测试时用…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…...
MTK Android12 安装app添加密码锁限制
提示:通过安装前输入密码的需求,来熟悉了解PMS 基本的安装流程 文章目录 一、需求实现需求原因提醒 二、UML图-类图三、参考资料四、实现效果五、需求修改点修改文件及路径具体修改内容 六、源码流程分析PMS的复杂性代码量实现aidl 接口PackageManagerSe…...
Redis 集合(Set)
Redis 集合(Set) Redis 是一款高性能的键值数据库,以其高性能、易用性以及丰富的数据结构而广受欢迎。在 Redis 中,集合(Set)是一种重要的数据结构,它支持多种操作,如添加、删除、查找元素,以及集合间的运算。本文将详细介绍 Redis 集合的特点、操作和应用场景。 Redi…...
[数据结构]堆详解
目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 (一)堆排序(重点) (二)TOP-K问题 一、堆的概念及结构 堆的…...
基于Python+Vue开发的旅游景区管理系统源码+运行步骤
项目简介 该项目是基于PythonVue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的旅游景…...
SpringBoot使用Logback日志框架与综合实例
日志框架的使用,系列文章: 《SpringBoot使用Logback日志框架与综合实例》 《SpringBoot使用@Slf4j注解实现日志输出》 《Log4j2日志记录框架的使用教程与简单实例》 《SpringBoot使用AspectJ实现AOP记录接口:请求日志、响应日志、异常日志》 《SpringBoot使用AspectJ的@Arou…...
LInux中常用的网络命令
配置 IP 地址 1.1 配置 IP 地址 IP 地址是计算机在互联网中唯一的地址编码。每台计算机如果需要接入网络和其他计算机进行数据通信,就必须配置唯一的公网 IP 地址。 配置 IP 地址有两种方法: 1)setup 工具 2)vi /etc/sysconf…...
怎么实现: 大语言模型微调案例
怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…...
快速学习Bootstrap前端框架
什么是 Bootstrap? Bootstrap 是一个开源的前端框架,用于快速开发响应式(Responsive)和美观的网页。它包含: ✅ HTML 组件(导航栏、按钮、表单等) ✅ CSS 样式(网格系统、排版、颜色等) ✅ JavaScript 交互(模态框、轮播图、工具提示等) 官网:Bootstrap The mo…...
KICK第四讲Linux 系统下安装 GCC 编译器全指南
Linux 系统下安装 GCC 编译器全指南 GCC(GNU Compiler Collection)是 Linux 系统下最常用的编译器之一,支持 C/C、Java 等多种编程语言。本文将介绍不同 Linux 发行版下的安装方法,帮助开发者快速配置开发环境。 一、使用包管理…...
深入理解 MySQL 锁:基于 InnoDB 的并发控制解析
在数据库并发访问管理中,MySQL 提供了强大的锁机制来保证数据的一致性和完整性。作为默认存储引擎的 InnoDB,为 MySQL 带来了细粒度的锁控制,使其成为高并发应用的理想选择。本文将深入探讨 MySQL 的锁类型、分类、应用场景及其对性能的影响&…...
Linux Nginx安装部署、注册服务
1、下载:https://nginx.org/en/download.html 下载nginx-1.27.4.tar.gz,上传到服务器 /opt/目录 在开始安装Nginx之前,首先需要安装一些依赖项,以确保Nginx编译和运行正常。打开终端并执行以下命令: yum install -y …...
