LeetCode | 最小路径和的两种解决办法

news2025/1/27 14:27:53

第一种:动态规划

思路

在过去,有这样一个词,那就是遇难则反,从起点推导出最小路径和是困难的,那我们就从终点去推导。

解题过程

我们都知道一个方块,只能向右或向下。在初始化dp之后,我们会有这样一条关系式:

d p [ i ] [ j ] = { g r i d [ m − 1 ] [ n − 1 ] if  i = = m − 1   a n d   j = = n − 1 m i n ( d p [ i + 1 ] [ j ] + g r i d [ i ] [ j ] , d p [ i ] [ j + 1 ] + g r i d [ i ] [ j ] ) if  i + 1 < m   a n d   j + 1 < n m i n ( d p [ i + 1 ] [ j ] + g r i d [ i ] [ j ] , d p [ i ] [ j ] ) if  i + 1 < m m i n ( d p [ i ] [ j ] , d p [ i ] [ j + 1 ] + g r i d [ i ] [ j ] ) if   j + 1 < n dp[i][j] = \left\{\begin{matrix} grid[m-1][n-1]&\text{if } i == m-1 \ and \ j == n-1 \\ min(dp[i+1][j] + grid[i][j], dp[i][j+1] + grid[i][j])&\text{if } i+1 < m \ and \ j+1 < n \\ min(dp[i+1][j] + grid[i][j], dp[i][j])&\text{if } i+1 < m \\ min(dp[i][j], dp[i][j+1] + grid[i][j])&\text{if } \ j+1 < n \end{matrix} \right. dp[i][j]= grid[m1][n1]min(dp[i+1][j]+grid[i][j],dp[i][j+1]+grid[i][j])min(dp[i+1][j]+grid[i][j],dp[i][j])min(dp[i][j],dp[i][j+1]+grid[i][j])if i==m1 and j==n1if i+1<m and j+1<nif i+1<mif  j+1<n

复杂度

时间复杂度: O ( N ⋅ M ) O(N \cdot M) O(NM)

空间复杂度: O ( N ⋅ M ) O(N \cdot M) O(NM)

Code

class Solution {
public:
	int minPathSum(vector< vector<int> > & grid) {
		vector<vector<int>> dp;
		int m = grid.size(), n = grid[0].size();
		for(int i = 1; i <= m; ++i) {
			vector<int> t (n, INT_MAX);
			dp.push_back(t);
		}
        dp[m-1][n-1] = grid[m-1][n-1];
		for(int i = m-1; i >= 0; --i) {
            for(int j = n-1; j >= 0; --j) {
                if(i == m-1 && j == n-1) continue;
                if(i+1 < m && j+1 < n) {
                    dp[i][j] = min(dp[i+1][j] + grid[i][j], dp[i][j+1] + grid[i][j]);
                } else {
                    if(i+1 < m) {
                        dp[i][j] = min(dp[i+1][j] + grid[i][j], dp[i][j]);
                    }
                    if(j+1 < n) {
                        dp[i][j] = min(dp[i][j+1] + grid[i][j], dp[i][j]);
                    }
                }
            }
        }
		return dp[0][0];
	}
};

第二种:BFS

思路

在过去,有这样一个词,那就是遇难则反,从起点推导出最小路径和是困难的,那我们就从终点去推导。

解题过程

这个其实就是利用优化过后的bfs去解决的

复杂度

时间复杂度: O ( M n ) O(Mn) O(Mn)

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

Code

class Solution {
public:
	int minPathSum(vector< vector<int> > & grid) {
		vector<vector<int>> dp;
		int m = grid.size(), n = grid[0].size();
		for(int i = 1; i <= m; ++i) {
			vector<int> t (n, INT_MAX);
			dp.push_back(t);
		}
		int xs[3] = {-1, 0};
		int ys[3] = {0, -1};
        int MINCount = INT_MAX;
		int cury = m-1, curx = n-1;
		dp[cury][curx] = grid[cury][curx];
		queue<pair<int, int>> Q;
		Q.push({curx, cury});
		while(!Q.empty()) {
			pair<int, int> top = Q.front();
			Q.pop();
			for(int i = 0; i < 2; ++i) {
				int tx = top.first + xs[i], ty = top.second + ys[i];
				if(tx < 0 || ty < 0) continue;
                if(i == 0) {
                    if(dp[top.second][top.first] + grid[ty][tx] < dp[ty][tx]) {
                        dp[ty][tx] = dp[top.second][top.first] + grid[ty][tx];
                        Q.push({tx, ty});
                    }
                } else {
                    if(top.second+ys[0] >= 0 && top.first+xs[0] >= 0 && dp[top.second][top.first] + grid[ty][tx] < dp[top.second+ys[0]][top.first+xs[0]]) {
                        dp[ty][tx] = dp[top.second][top.first] + grid[ty][tx];
                        Q.push({tx, ty});
                    } else if(dp[top.second][top.first] + grid[ty][tx] < dp[ty][tx]) {
                        dp[ty][tx] = dp[top.second][top.first] + grid[ty][tx];
                        Q.push({tx, ty});
                    }
                }
			}
		}
		return dp[0][0];
	}
};

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

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

相关文章

Windows 环境下 Docker Desktop + Kubernetes 部署项目指南

Windows 环境下 Docker Desktop Kubernetes 部署项目指南 一、环境准备二、安装与配置 Kubernetes安装 windows 版的 docker启动 kubernetes安装 windows 版的 kubectl 工具下载 k8s-for-docker-desktop启动 Kubernetes Dashboard 二、在 Kubernetes 上部署项目创建一个 demo …

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket&#xff1f;&#xff08;简介&#xff09; 二、为什么需要 WebSocket&#xff1f; 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…

神经网络|(二)sigmoid神经元函数

【1】引言 在前序学习进程中&#xff0c;我们已经了解了基本的二元分类器和神经元的构成&#xff0c;文章学习链接为&#xff1a; 神经网络|(一)加权平均法&#xff0c;感知机和神经元-CSDN博客 在此基础上&#xff0c;我们认识到神经元本身在做二元分类&#xff0c;是一种非…

云原生:构建现代化应用的基石

一、什么是云原生&#xff1f; 云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的分布式系统优势&#xff0c;例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点&#xff0c;能够更好地适应云平台的动态变化&…

【浏览器 - Chrome调试模式,如何输出浏览器中的更多信息】

在开发过程中&#xff0c;如果不主动console.log&#xff0c;浏览器中的信息有些不会主动输出到 控制台console里面。这个如果是一些浏览器内部的接口调试&#xff0c;则会很麻烦。比如RTCPeerConnection过程 &#xff0c;RTCPeerConnection属于浏览器内部的方法&#xff0c;其…

MapReduce,Yarn,Spark理解与执行流程

MapReduce的API理解 Mapper 如果是单词计数&#xff1a;hello&#xff1a;1&#xff0c; hello&#xff1a;1&#xff0c; world&#xff1a;1 public void map(Object key, // 首字符偏移量Text value, // 文件的一行内容Context context) // Mapper端的上下文&#xff0c;…

unity导入图片素材注意点和AI寻路模块导入

当我们导入了图片资源&#xff0c;我们需要设置为Sprite类型 UI资源的位置通常是Rect Transform 要进行转化&#xff1a; (imgHP.transform as RectTransform).sizeDelta new Vector2((float)hp / maxHP * hpW,74); RectTransform 是Unity中用于UI元素的特殊变换组件&#…

单片机-STM32 IIC通信(OLED屏幕)(十一)

一、屏幕的分类 1、LED屏幕&#xff1a; 由无数个发光的LED灯珠按照一定的顺序排列而成&#xff0c;当需要显示内容的时候&#xff0c;点亮相关的LED灯即可&#xff0c;市场占有率很高&#xff0c;主要是用于户外&#xff0c;广告屏幕&#xff0c;成本低。 LED屏是一种用发光…

Windows Docker Desktop安装及使用 Docker 运行 MySQL

Docker Desktop是Docker的官方桌面版&#xff0c;专为Mac和Windows用户设计&#xff0c;提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎&#xff0c;为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…

Day21-【软考】短文,计算机网络开篇,OSI七层模型有哪些协议?

文章目录 OSI七层模型有哪些&#xff1f;有哪些协议簇&#xff1f;TCP/IP协议簇中的TCP协议三次握手是怎样的&#xff1f;基于UDP的DHCP协议是什么情况&#xff1f;基于UDP的DNS协议是什么情况&#xff1f; OSI七层模型有哪些&#xff1f; 题目会考广播域 有哪些协议簇&#x…

巧妙获取ListBox控件的选中条目(按点击顺序)

实例需求&#xff1a;用户窗体中有两个控件 列表框&#xff1a;ListBox1&#xff0c;支持多选按钮&#xff1a;CommandButton1 现在需要记录用户在列表框中选择顺序&#xff08;不考虑选中后再次点击取消选中的操作&#xff09;&#xff0c;如下图所示。 Dim objDic As Objec…

动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践

利用图神经网络进行节点分类&#xff1a;从理论到实践 前言 在之前的学习中&#xff0c;大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络&#xff08;GNNs&#xff09;来解决节点分类问题。在节点分类任务里&#xff0c;大家往往仅掌握少量节点的真实…

Level DB --- TableBuilder

TableBuilder是Level DB里面重要的类和模块&#xff0c;它描述了数据如何序列化到文件中&#xff0c;以及数据里面的格式逻辑。它里面包含了之前介绍的多个模块和类。 data block、filter block和index block block格式&#xff0c;之前已经介绍过Level DB --- BlockBuilder-…

Leecode刷题C语言之组合总和②

执行结果:通过 执行用时和内存消耗如下&#xff1a; int** ans; int* ansColumnSizes; int ansSize;int* sequence; int sequenceSize;int** freq; int freqSize;void dfs(int pos, int rest) {if (rest 0) {int* tmp malloc(sizeof(int) * sequenceSize);memcpy(tmp, seque…

Hook 函数

什么是hook函数&#xff1f; 在计算机编程中&#xff0c;hook函数是指在特定的事件发生时被调用的函数&#xff0c;用于在事件发生前或后进行一些特定的操作。通常&#xff0c;hook函数作为回调函数被注册到事件处理器中&#xff0c;当事件发生时&#xff0c;事件处理器会自动…

自然元素有哪些选择?

在设计浪漫风格的壁纸时&#xff0c;自然元素是营造温馨、梦幻氛围的关键。以下是一些常见的自然元素选择&#xff0c;以及它们在壁纸设计中的应用建议&#xff1a; 一、花朵 玫瑰&#xff1a; 特点&#xff1a;玫瑰是浪漫的象征&#xff0c;尤其是红色和粉色玫瑰&#xff0c;…

【miniconda】:langraph的windows构建

langraph需要python3.11 langraph强烈建议使用py3.11 默认是3.12 官方 下载仓库 下载老版本的python (后续发现新版miniconda也能安装老版本的python) 在这里

自动驾驶中的多传感器时间同步

目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考&#xff1a; 前言 对多传感器数据…

【蓝桥杯】43692.青蛙跳杯子

题目描述 X 星球的流行宠物是青蛙&#xff0c;一般有两种颜色&#xff1a;白色和黑色。 X 星球的居民喜欢把它们放在一排茶杯里&#xff0c;这样可以观察它们跳来跳去。 如下图&#xff0c;有一排杯子&#xff0c;左边的一个是空着的&#xff0c;右边的杯子&#xff0c;每个…

[Dialog屏幕开发] 屏幕绘制(下拉菜单)

阅读该篇文章之前&#xff0c;可先阅读下述资料 [Dialog屏幕开发] Table Control 列数据操作https://blog.csdn.net/Hudas/article/details/145343731?spm1001.2014.3001.5501上篇文章我们的屏幕已实现了如下功能 我们已经设置了按钮对Table Control 列的数据进行了操作 接下…