【每日一题】【12.11】1631.最小体力消耗路径

1631. 最小体力消耗路径icon-default.png?t=N7T8https://leetcode.cn/problems/path-with-minimum-effort/这道题目的核心思路是:使用了二分查找和BFS (深度优先遍历)结合的方式来解决路径搜索问题,在每一次二分查找中,通过 BFS 来检查是否存在满足条件的路径,并不断调整查找的范围,直到找到满足条件的最小值为止

第一步

 static constexpr int dirs[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};

static:关键字用于声明类的静态成员变量或函数,constexpr关键字用于声明常量表达式,连起来用于声明静态常量成员变量

dirs:用于表示四个方向的偏移量。这个数组是一个2维数组,包含了4个方向的偏移值。

{ -1, 0 } 表示向左移动一个单位(在二维平面上,x轴减少1,y轴不变)。
{ 1, 0 } 表示向右移动一个单位(在二维平面上,x轴增加1,y轴不变)。
{ 0, -1 } 表示向上移动一个单位(在二维平面上,y轴减少1,x轴不变)。
{ 0, 1 } 表示向下移动一个单位(在二维平面上,y轴增加1,x轴不变)。

第二步

 queue<pair<int,int>> q;//定义一个队列存储BFS中待访问的结点坐标q.emplace(0,0);//创建一个数组,记录已经访问过的结点vector<int> seen(m*n);seen[0] = 1;

1.声明了一个队列 q,这个队列用于在 BFS 中存储待访问的节点坐标。这里使用了 pair<int, int>,表示一个二维平面上的点的坐标,pair 类型中的两个整数分别表示 x 和 y 坐标。

2.将起始节点的坐标 (0, 0) 放入队列 q 中。在 BFS 中,通常从起始节点开始遍历或搜索。

3.创建了一个大小为 m * nseen 数组,用于标记已经访问过的节点。这个数组在 BFS 中用于避免重复访问节点(存储方式是m*x + y)

4.将起始节点 (0, 0) 所代表的索引位置(假设是二维平面中的第一个节点)标记为已访问,即将 seen 数组中对应的位置值设为 1

int m = heights.size();//行数
int n = heights[0].size();//列数

表示行数和列数

第三步

 while(!q.empty()){//BFSauto[x,y] = q.front();q.pop();for(int i = 0;i < 4; i++){int nx = x + dirs[i][0];int ny = y + dirs[i][1];//计算当前节点 (x, y) 的第 i 个方向上相邻节点的坐标if(nx >= 0 && nx < m && ny >= 0 && ny < n && !seen[nx * n + ny] && abs(heights[x][y]-heights[nx][ny]) <= mid){q.emplace(nx,ny);//如果相邻节点满足条件,将其坐标 (nx, ny) 加入队列 q,表示将要访问这个节点。seen[nx * n + ny] = 1;//同时标记这个相邻节点为已访问(在 seen 数组中将其对应位置的值设为 1),避免重复访问} }

 当队列 q 不为空时执行,意味着还有待访问的节点,从队列 q 中取出队首元素(当前节点的坐标),并将其分别赋值给变量 xy。然后将该节点从队列中移出。计算当前节点 (x, y) 的第 i 个方向上相邻节点的坐标。如果相邻节点满足条件,将其坐标 (nx, ny) 加入队列 q,表示将要访问这个节点。同时标记这个相邻节点为已访问(在 seen 数组中将其对应位置的值设为 1),避免重复访问。

abs() 是 C++ 中的一个函数,用于计算数值的绝对值。

第四步

 if(seen[m * n -1]){//最后一个进入到数组中了已经被访问ans = mid;right = mid -1;}else{left = mid + 1;}

二分法部分当 if(seen[m * n -1])表示最后一个进入到数组中了已经被访问

所以总体代码实现为

class Solution {
private:static constexpr int dirs[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};
public:int minimumEffortPath(vector<vector<int>>& heights) {int left = 0; int right = 999999;//十的六次方-1int ans = 0;while(left <= right){int m = heights.size();//行数int n = heights[0].size();//列数int mid = left + ((right - left)/2);queue<pair<int,int>> q;//定义一个队列存储BFS中待访问的结点坐标q.emplace(0,0);//创建一个数组,记录已经访问过的结点vector<int> seen(m*n);seen[0] = 1;while(!q.empty()){//BFSauto[x,y] = q.front();q.pop();for(int i = 0;i < 4; i++){int nx = x + dirs[i][0];int ny = y + dirs[i][1];if(nx >= 0 && nx < m && ny >= 0 && ny < n && !seen[nx * n + ny] && abs(heights[x][y]-heights[nx][ny]) <= mid){q.emplace(nx,ny);seen[nx * n + ny] = 1;} }}if(seen[m * n -1]){//最后一个进入到数组中了已经被访问ans = mid;right = mid -1;}else{left = mid + 1;}}return ans;}
};

有一个注意的点,注意看heights大小的最大值为10的六次方,所以我们right初始值为10的六次方-1.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

viple与物理机器人(一):线控模拟

为了检测viple程序与物理机器人是否能顺利连接上 如果能顺利连接上&#xff0c;那么&#xff0c;可以通过内建事件从而控制物理机器人的前进、后退、左转、右转以及暂停。 如果不能连接上&#xff0c;首先&#xff0c;程序无法控制物理机器人&#xff0c;其次&#xff0c;当vip…

volatile 关键字的作用(变量可见性、禁止重排序)

volatile 关键字的作用&#xff08;变量可见性、禁止重排序&#xff09; Java 语言提供了一种稍弱的同步机制&#xff0c;即 volatile 变量&#xff0c;用来确保将变量的更新操作通知到其他线程。volatile 变量具备两种特性&#xff0c;volatile 变量不会被缓存在寄存器或者对…

在做题中学习(31):电话号码的字母组合(全排列)

17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;既然要排列组合&#xff0c;就得先根据数字字符取出来 所以先定义一个string类的数组通过下标取到每个数字对应的映射。 string _numsTostr[10]{"","","abc"…

12.11 C++ 作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

如何在Word中简洁地插入代码

如何在Word中简洁地插入代码 背景&#xff1a; ​ 最近在一写一些论文或者报告的时候&#xff0c;需要将源代码放在论文的最后&#xff0c;有一个很头疼的问题&#xff0c;如果直接把代码从编辑器复制到word中&#xff0c;就变成了下面这个样子&#xff1a; 这有点丑陋啊&…

jemeter,同一线程组内,调用cookie实现接口关联

取cookie方式参考上一篇&#xff1a;jemeter&#xff0c;取“临时重定向的登录接口”响应头中的cookie-CSDN博客 元件结构 登录后要执行的接口为“api/get_event_list/”&#xff0c;在该HTTP请求下创建HTTP信息头管理器&#xff0c;配置如下&#xff1a; 执行测试后&#xff0…

Elasticsearch,Kibana集成,x-pack鉴权配置

Elasticsearch,Kibana集成 Java8环境部署[CentOS7] cd /usr/local/src wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.gztar -xzvf jdk-8u201-linux-x64.tar.gz -C /usr/local#配置环境变量 vim /etc/profile #文末添加 export JAVA_HOME/us…

轻空间助力中国高校实现场馆多功能一体化

中国高校在迎接体育、文艺、学术等多元化需求的同时&#xff0c;面临着场馆设施不足、建设成本高的难题。然而&#xff0c;随着轻空间&#xff08;江苏&#xff09;膜科技有限公司的崭新解决方案的引入&#xff0c;中国高校如苏州大学等正迎来一场场馆多功能一体化的革命。 创新…

某信服 EDR 白程序DLL劫持

本文用到的白程序回复公众号20231211进行获取。 嗯… 记得去年HW的时候某信服给我装的EDR一直没卸载&#xff0c;不是不想卸载&#xff0c;是因为卸载要密码&#xff0c;所以就摆烂了。。。。 找到EDR这个目录&#xff0c;然后把目录复制到虚拟机中&#xff0c;然后一个一个e…

C++ Qt开发:PushButton按钮组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QPushButton按钮组件的常用方法及灵活运用。 …

为什么推荐将静态资源放到CDN上?

一、什么是静态资源 说到静态资源&#xff0c;我们还要知道什么是动态资源 静态资源 静态资源是指在服务器上存储的不经常改变的文件&#xff0c;如图片、CSS 文件、JavaScript 文件、字体文件等。与之相对的是动态资源&#xff0c;动态资源是根据用户请求和服务器端处理生成的…

视频中自监督学习:「我的世界」下指令理解与跟随

本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展&#xff0c;题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 ​ GROOT 该研究的核心目标是探索能否摆脱文本数据的标…