【面试经典150 | 动态规划】最小路径和

news2025/2/23 2:16:29

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:动态规划
    • 方法二:空间优化
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【动态规划-空间优化】【数组】


题目来源

64. 最小路径和


解题思路

方法一:动态规划

定义状态

朴素的动态规划方法是定义状态 dp[i][j],表示从网格左上角 (0, 0) 位置到 (i, j) 位置的最小路径和。

状态转移

根据题目中 “每次只能向下或者向右移动一步”,可知到达位置 (i, j) 只能从 (i-1, j) 向下移动一步或者从 (i, j-1) 向右一步,因此有转移关系:

d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) , i ≥ 1 , j ≥ 1 dp[i][j] = min(dp[i-1][j], dp[i][j-1]), i \ge 1, j \ge 1 dp[i][j]=min(dp[i1][j],dp[i][j1]),i1,j1

base case

dp[0][0] = grid[0][0]

对于网格 grid 中的第一行和第一列位置,只能从对应位置的左侧和上方的位置移动一步得到,于是需要进行如下方式的初始化:

// 第一列
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];
}

最后返回

dp[m-1][n-1] 表示从网格左上角到网格右下角的最小路径和。

实现代码

class Solution {
public:
	int minPathSum(vector<vector<int>>& grid) {
		int m = grid.size(), n = grid[0].size();
		vector<vector<int>> dp = vector<vector<int>>(m, vector<int>(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] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
			}
		}
		return dp[m - 1][n - 1];
	}
};

复杂度分析

时间复杂度: O ( m n ) O(mn) O(mn) m m m 为网格 grid 的行数, n n n 为网格的列数。

空间复杂度: O ( m n ) O(mn) O(mn)

方法二:空间优化

方法一中朴素解法的空间复杂度可以进行优化,只需要使用 O ( m i n { m , n } ) O(min\{m, n\}) O(min{m,n}) 的复杂度即可解决。

我们以 示例 1 为例说明,如何使用线性空间解决本题。

网格的行数和列数一样,选择按行来更新最小路径和(选择列也可以),维护一个数组 dp 长度为 3。

初始化 dp = {1, 4, 5}dp[0] 表示从位置 (0, 0) 到位置 (0, 0) 的最小路径和;dp[1] 表示从位置 (0, 0) 到位置 (0, 1) 的最小路径和;dp[2] 表示从位置 (0, 0) 到位置 (0, 2) 的最小路径和。

在网格的第一行(从 0 开始数),dp[0] 表示从位置 (0, 0) 到位置 (1, 0) 的最小路径和,因为只能从 (0, 0) 位置到 (1, 0) 位置,所以更新 dp[0] = dp[0] + grid[1][0]dp[1] 表示从位置 (0, 0) 到位置 (1, 1) 的最小路径和,因为可以从 (1, 0) 位置向右或者 (0, 1) 位置向下移动到位置 (1, 1),所以有 dp[1] = min(dp[0], dp[1]) + grid[i][j]

具体实现见如下代码。

实现代码

class Solution {
public:
	int minPathSum(vector<vector<int>>& grid) {
		int m = grid.size();
		int n = grid[0].size();

		int more = max(m, n);
		int less = min(m, n);
		bool rowMore = more == m;	// 判断是否是行数大于等于列数
		vector<int> arr(less);      // 以较短维度的长度作为临时空间,比如列数较小
		int i, j;
		for (i = 0; i < less; ++i) {// 更新第 0 行的所有列,即初始化
			if (i == 0) {
				arr[i] = grid[0][0];
			}
			else {
				arr[i] = arr[i - 1] + (rowMore ? grid[0][i] : grid[i][0]);
			}
		}

		for (i = 1; i < more; ++i) {// 按照行进行更新
			arr[0] = arr[0] + (rowMore ? grid[i][0] : grid[0][i]);  // 更新 i 行 0 列的答案
			for (j = 1; j < less; ++j) {                            // 更新 i 行其他列的答案
				arr[j] = min(arr[j - 1], arr[j]) + (rowMore ? grid[i][j] : grid[j][i]);
			}
		}
		return arr[less-1];
	}
};

复杂度分析

时间复杂度: O ( m n ) O(mn) O(mn) m m m 为网格 grid 的行数, n n n 为网格的列数。

空间复杂度: O ( m i n { m , n } ) O(min\{m, n\}) O(min{m,n})


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

vue-quill-editor 富文本编辑器(可上传视频图片),组件挂载的方式实现

1.安装 npm install vue-quill-editor --save npm install quill-image-drop-module --save npm install quill-image-resize-module --save2.在组件下面新增组件 QlEditor (1)index.vue <template><div><div idquillEditorQiniu><!-- 基于element…

邀请函 | 第89届CMEF即将开幕,我们上海见!

2024年4月11日~14日&#xff0c;第89届中国国际医疗器械&#xff08;春季&#xff09;博览会&#xff08;简称&#xff1a;CMEF&#xff09;将在上海国家会展中心举行&#xff0c;届时飞凌嵌入式将隆重亮相&#xff0c;展出适用于IVD、医疗影像、生命体征监测等医疗设备的嵌入式…

划重点!实物黄金和现货黄金的区别

有人说虽然现货黄金不是实物黄金&#xff0c;但却胜于实物黄金&#xff0c;我们认为如果从投资的便利性&#xff0c;以及潜的获利空间这两个主要的方面来说&#xff0c;上述的观点是相当正确的。但投资者在正式参与之前&#xff0c;最好还是认真了解一下实物黄金和现货黄金的主…

上位机图像处理和嵌入式模块部署(qmacvisual亮度检测)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;在机器视觉当中&#xff0c;对于光源的处理要非常小心。这里面不仅包括了选择什么样的光源&#xff0c;还取决于怎样使用…

软件设计不是CRUD(17):低耦合模块设计理论——总结

本文将已经介绍的低耦合设计理论梳理成一张思维导图&#xff0c;便于各位读者下载浏览。感兴趣但未阅读VIP文章的读者&#xff0c;可以解锁相关详细内容。&#xff08;第9篇——第16篇&#xff09; &#xff08;可直接保存到本地后&#xff0c;放大阅读&#xff09; 从后文开…

UE4_破碎插件的蓝图节点_Apply Radius Damage

一、知识点 Apply Radius Damage:破碎组件所带的蓝图节点。 二、使用方法&#xff1a; 1、设置——插件&#xff0c;搜索destruction&#xff0c;找到 Apex Destruction&#xff0c;勾选已启用。重启虚幻编辑器。 2、这样右键操作就有创建可破坏的网格体菜单&#xff0c;将do…

C++初学者:优雅创建第一个窗口

我想学习C做一些实用的程序&#xff0c;但是我不想在软件界面上花太多的时间&#xff0c;可是每每就是界面影响我的思绪。 今天学习C类的包装知识&#xff0c;终于整出了一个我的界面类&#xff0c;虽然封装水平很弱&#xff0c; 这次就用这个类&#xff0c;写了自己工作上常用…

资源优化题

资源平滑类资源优化题 不改变关键路径的情况下&#xff0c;如何避免资源扎堆使用。 破解思路: 1、能串行尽量串行。 2、一定要并行&#xff0c;尽量躲开跟人数多的活动并行。 3、如何躲开&#xff0c;就靠时差来实现。 例题1&#xff1a;某工程包括A、B、C、D、E、F、G七项工作…

Windows搭建Lychee图片管理系统结合内网穿透实现公网访问本地图床

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

Java就近原则和this关键字

Java 中的就近原则和 this 关键字有着密切的关系&#xff0c;特别是在处理成员变量与方法参数同名的情况下。就近原则指的是在同一作用域下&#xff0c;优先使用最近声明的变量或参数。 在 Java 中&#xff0c;如果一个方法的参数与类的成员变量同名&#xff0c;为了明确指示要…

E5071C是德科技E5071C网络分析仪

181/2461/8938产品概述&#xff1a; E5071C ENA 矢量网络分析仪&#xff0c;9 kHz 至 20 GHz&#xff0c;配有增强型 TDR 测量选件。E5071C 网络分析仪具有较高的射频性能和较快的速度&#xff0c;并具有宽频率范围和全面的功能。它是制造和研发工程师们测试频率范围在 20 GHz…

Redis 全景图(2)---- 关于 Redis 的三“高”

前言 我们继续写第一篇文章没写完的。其实我也不想将我写的一篇 Redis 文章分成几篇中短文来写&#xff0c;但是没办法&#xff0c;我一次写个1万字&#xff0c;会限流&#xff0c;所以将就一下吧。 上篇文章我用了 Redis 的6大模块这个思路来描绘我脑子中的 Redis。其实这6大…

生女儿一定要把她打扮成自己喜欢的样子

不仅女儿喜欢我也很喜欢 一套上身满满的美式学院风 有蓝、杏两种颜色 条纹短袖衬衫搭配短款百褶裙 简约百搭&#xff0c;时尚单品 全棉面料&#xff0c;舒适透气

2024年第三期丨全国高校大数据与人工智能师资研修班邀请函

2024年第三期 杭州线下班 数据采集与机器学习实战&#xff08;Python&#xff09; 线上班 八大专题 大模型技术与应用实战 数据采集与处理实战&#xff08;Python&八爪鱼&#xff09; 大数据分析与机器学习实战&#xff08;Python&#xff09; 商务数据分析实战&…

windows无法使用hadoop报错:系统找不到路径

在windows下安装hadoop-3.1.4,进行环境变量配置后&#xff0c;打开window命令行窗口测试hadoop命令&#xff0c;报错&#xff0c;如图所示&#xff1a; 方案&#xff1a;由于JAVA_HOME路径有空格导致&#xff0c;可修改hadoop下\etc\hadoop\hadoop_env.cmd文档中set JAVA_HOME以…

提效提速的快捷回复工具

在数字化交流日益增长的今天&#xff0c;客服工作显得尤为重要。为了提升对话质量和回复速度&#xff0c;同时减少重复劳动&#xff0c;我同事给我介绍了一款快捷回复工具&#xff0c;叫做客服宝聊天助手。我用了几天真心觉得好好用&#xff0c;今天特地分享这个软件给你们&…

Kubernetes(k8s):如何进行 Kubernetes 集群健康检查?

Kubernetes&#xff08;k8s&#xff09;&#xff1a;如何进行 Kubernetes 集群健康检查&#xff1f; 一、节点健康检查1、使用 kubectl 查看节点状态2、查看节点详细信息3、检查节点资源使用情况 2、Pod 健康检查2.1、 使用 kubectl 查看 Pod 状态2.2、 查看特定 Pod 的详细信息…

弱电工程有哪些系统?一站式解决方案

随着科技的不断进步&#xff0c;现代建筑不仅仅是砖石和水泥的堆砌&#xff0c;它们已经转化为拥有高度智能化的复杂结构。在这些建筑的核心&#xff0c;弱电工程扮演着至关重要的角色。今天&#xff0c;我们将深入探讨弱电工程的各个组成部分以提供的解决方案。 弱电工程涵盖…

【软路由】iStoreOS全量备份或数据迁移思路

背景&#xff1a;之前是在我的i3小主机上面搭建了iStoreOS&#xff0c;因为有段时间爱折腾&#xff0c;于是乎不知道什么情况就造成首页无法登录&#xff0c;改了的东西无法回滚&#xff0c;好在使用“万能重启”法又可以登录了&#xff0c;于是我就在想把这玩意定期备份一下。…

PCB的电气/物理特性检查项目需思考的问题

在PCB设计、制造和装配过程中&#xff0c;为确保产品性能和质量&#xff0c;电子工程师必须进行电气特性和物理特性检查&#xff0c;然而对很多新人来说如何高效进行检查是个难题&#xff0c;所以下面将分别探讨这些检查时需要考虑的问题。 1、PCB电气特性检查项目①导线参数分…