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

力扣热题 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. 题目描述

给定两个字符串 text1text2,求它们的最长公共子序列的长度。

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. 题目描述

给定两个字符串 word1word2,求将 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&#xff1a;哈希专题三道题详细解析(JAVA) 力扣热题 100&#xff1a;双指针专题四道题详细解析(JAVA) 力扣热题 100&#xff1a;滑动窗口专题两道题详细解析&#xff08;JAVA&#xff09; 力扣热题 100&#xff1a;子串专题三道题详细解析(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分布式测试插件

平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完&#xff1b; 当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部分&#xff0c;于是执行时间缩短一…...

文件解析漏洞靶场解析全集详解

lls解析漏洞 目录解析 在网站的下面将一个1.asp文件夹&#xff0c;在里面建一个2.txt文件在里面写入<% -now()%>这个显示时间的代码&#xff0c;再将文件名改为2.jpg。 发现2.jpg文件以asp形式执行 畸形文件解析 将2.jpg文件移到网站的下面与1.asp并列&#xff0c;将名…...

C语言数据结构:数组

1. 数组&#xff08;Array&#xff09; 1.1 定义 数组是一种线性数据结构&#xff0c;由相同类型的元素组成&#xff0c;这些元素在内存中按顺序存储。数组的大小在声明时确定&#xff0c;且不可动态改变。 1.2 类型细分 根据维度和用途&#xff0c;数组可以分为以下几种类型…...

LeetCode-移动零

一、题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums […...

PDF Reader

Acrobat Reader...

孔夫子根剧关键字获取在售商品 API

要使用孔夫子旧书网根据关键字获取在售商品的 API&#xff0c;需要以下步骤1&#xff1a; 注册与认证&#xff1a;在孔夫子旧书网的开发者平台注册一个账号&#xff0c;登录后创建一个新的应用&#xff0c;以获取 API 密钥&#xff08;key&#xff09;和调用密钥&#xff08;s…...

Qt的QToolButton设置弹出QMenu下拉菜单

在Qt中&#xff0c;使用QToolButton显示下拉菜单可以通过以下步骤实现&#xff1a; 基本实现步骤 创建QToolButton&#xff1a;实例化一个QToolButton对象。创建QMenu&#xff1a;实例化一个QMenu作为下拉菜单。添加菜单项&#xff1a;通过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源代码的引用&#xff0c;结合springboot使用时&#xff0c;会存在es版本的冲突&#xff0c;这里记录下解决冲突和使用方式&#xff08;es已经不建议使用这个了&#xff09;。 注意es服务端的版本需要与client的版本对齐&#xff0c;否则返回数据可…...

Vue项目搜索引擎优化(SEO)终极指南:从原理到实战

文章目录 1. SEO基础与Vue项目的挑战1.1 为什么Vue项目需要特殊SEO处理&#xff1f;1.2 搜索引擎爬虫工作原理 2. 服务端渲染&#xff08;SSR&#xff09;解决方案2.1 Nuxt.js框架实战原理代码实现流程图 2.2 自定义SSR实现 3. 静态站点生成&#xff08;SSG&#xff09;技术3.1…...

LeetCode:93. 复原 IP 地址(DFS Java)

目录 93. 复原 IP 地址 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 93. 复原 IP 地址 题目描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xf…...

Spring Boot 中实现全局 Token 验证的两种方式

文章目录 学习文章&#xff1a;Spring Boot 中实现全局 Token 验证的两种方式 一、为什么需要全局 Token 验证&#xff1f;二、使用拦截器实现全局 Token 验证1. 创建 Token 验证拦截器2. 注册拦截器3. 测试拦截器 三、使用过滤器实现全局 Token 验证1. 创建 Token 验证过滤器2…...

【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)

本篇文章主要包含Jmeter的下载安装、环境配置 添加线程组、结果树、HTTP请求、请求头设置。JSON提取器的使用&#xff0c;用户自定义变量 目录 一&#xff1a;引入 1&#xff1a;软件介绍 2&#xff1a;工作原理 3&#xff1a;安装Jmeter 4&#xff1a;启动方式 &#xf…...

【Matlab仿真】如何解决三相交流信号源输出波形失真问题?

问题描述 如标题所示&#xff0c;在搭建simulink模型过程中&#xff0c;明明模型搭建的没有问题&#xff0c;但是输出的波形却不是理想的正弦波&#xff0c;影响问题分析。 问题分析 以三相交流信号源输出波形为例&#xff0c;输出信号理应为三相正弦量&#xff0c;但是仿真…...

Fiora聊天系统本地化部署:Docker搭建与远程在线聊天的实践指南

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 这个通讯软件泛滥的时代&#xff0c;每天都在刷着同样的朋友圈、看着千篇一律的表情包&#xff0c;是不是觉得有点腻了&#…...

metersphere接口测试(1)使用MeterSphere进行接口测试

文章目录 前言接口文档单接口测试环境配置梳理接口测试场景测试接口 接口自动化怎么写复用性高的自动化测试用例 总结 前言 大汉堡工作第203天&#xff0c;本篇记录我第一次接触接口测试任务&#xff0c;最近有些懈怠啊~ 接口文档 首先就是接口地址&#xff0c;接口测试时用…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…...

MTK Android12 安装app添加密码锁限制

提示&#xff1a;通过安装前输入密码的需求&#xff0c;来熟悉了解PMS 基本的安装流程 文章目录 一、需求实现需求原因提醒 二、UML图-类图三、参考资料四、实现效果五、需求修改点修改文件及路径具体修改内容 六、源码流程分析PMS的复杂性代码量实现aidl 接口PackageManagerSe…...

Redis 集合(Set)

Redis 集合(Set) Redis 是一款高性能的键值数据库,以其高性能、易用性以及丰富的数据结构而广受欢迎。在 Redis 中,集合(Set)是一种重要的数据结构,它支持多种操作,如添加、删除、查找元素,以及集合间的运算。本文将详细介绍 Redis 集合的特点、操作和应用场景。 Redi…...

[数据结构]堆详解

目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 ​编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 &#xff08;一&#xff09;堆排序&#xff08;重点&#xff09; &#xff08;二&#xff09;TOP-K问题 一、堆的概念及结构 堆的…...

基于Python+Vue开发的旅游景区管理系统源码+运行步骤

项目简介 该项目是基于PythonVue开发的旅游景区管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Python的旅游景…...

SpringBoot使用Logback日志框架与综合实例

日志框架的使用,系列文章: 《SpringBoot使用Logback日志框架与综合实例》 《SpringBoot使用@Slf4j注解实现日志输出》 《Log4j2日志记录框架的使用教程与简单实例》 《SpringBoot使用AspectJ实现AOP记录接口:请求日志、响应日志、异常日志》 《SpringBoot使用AspectJ的@Arou…...

LInux中常用的网络命令

配置 IP 地址 1.1 配置 IP 地址 IP 地址是计算机在互联网中唯一的地址编码。每台计算机如果需要接入网络和其他计算机进行数据通信&#xff0c;就必须配置唯一的公网 IP 地址。 配置 IP 地址有两种方法&#xff1a; 1&#xff09;setup 工具 2&#xff09;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&#xff08;GNU Compiler Collection&#xff09;是 Linux 系统下最常用的编译器之一&#xff0c;支持 C/C、Java 等多种编程语言。本文将介绍不同 Linux 发行版下的安装方法&#xff0c;帮助开发者快速配置开发环境。 一、使用包管理…...

深入理解 MySQL 锁:基于 InnoDB 的并发控制解析

在数据库并发访问管理中&#xff0c;MySQL 提供了强大的锁机制来保证数据的一致性和完整性。作为默认存储引擎的 InnoDB&#xff0c;为 MySQL 带来了细粒度的锁控制&#xff0c;使其成为高并发应用的理想选择。本文将深入探讨 MySQL 的锁类型、分类、应用场景及其对性能的影响&…...

Linux Nginx安装部署、注册服务

1、下载&#xff1a;https://nginx.org/en/download.html 下载nginx-1.27.4.tar.gz&#xff0c;上传到服务器 /opt/目录 在开始安装Nginx之前&#xff0c;首先需要安装一些依赖项&#xff0c;以确保Nginx编译和运行正常。打开终端并执行以下命令&#xff1a; yum install -y …...