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

🔥博客主页: A_SHOWY
🎥系列专栏:力扣刷题总结录 数据结构  云计算  数字图像处理     

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()){
            //BFS
            auto[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;//十的六次方-1
    int 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()){
            //BFS
            auto[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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NR技术】NR NG-RAN整体架构 -网络接口以及无线协议框架(四)

1 引言 本博文介绍NR NG-RAN的网络节点间的接口以及无线协议框架。网络接口介绍包括RAN和NGC之间的NG接口&#xff1b;无线协议框架包括用户面和控制面协议。 2 NG接口 2.1 NG用户面接口 NG-U (user plane interface)是NG-RAN节点与UPF之间的接口。NG接口的用户平面协议栈如图…

1688以图搜图调用商品详情的API接口功能实现【附详细代码教程】

背景 在1688有个功能&#xff0c;就是上传图片&#xff0c;就可以找到类似的商品。如下 网址 &#xff1a;https://www.1688.com/ 这时候&#xff0c;我们可以使用程序来代替&#xff0c;大批量的完成图片上传功能。 实现思路 1、找到图片上传接口 post请求&#xff0c;for…

禾匠榜店商城系统 RCE漏洞复现

0x01 产品简介 禾匠榜店商城系统是浙江禾匠信息科技有限公司的一套基于PHP和MySQL的商城系统。 0x02 漏洞概述 禾匠榜店商城系统的api/testOrderSubmit模块下的preview方法存在命令执行漏洞,攻击者可以向服务器写入木马文件,直接获取服务器权限 0x03 漏洞概述 FOFA:bod…

【qt】Qt+OpenCv读取带有中文路径的图片

【opencv4.5.1版本】下载exe解压即可。。。https://opencv.org/releases/page/2/ 【qt5.15.2】 pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to …

2.Feign使用、上下文隔离及源码阅读

目录 概述使用配置pom.xmlfeign 接口编写controller 测试降级处理pom.xmlapplication.yml代码 Feign如何初始化及调用源码阅读初始化调用 feign的上下文隔离机制源码 结束 概述 阅读此文&#xff0c;可以知晓 feign 使用、上下文隔离及源码阅读。源码涉及两方面&#xff1a;fe…

elk:filebeat

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多。 filebeat可以运行在非java环境&#xff0c;他可以代替logstash在非java环境上收集日志。 filebeat无法实现数据的过滤…

先进的Web3.0实战热门领域NFT项目几个总结分享

非同质化代币&#xff08;NFT&#xff09;的崛起为游戏开发者提供了全新的机会&#xff0c;将游戏内物品和资产转化为真正的可拥有和交易的数字资产。本文将介绍几个基于最先进的Web3.0技术实践的NFT游戏项目&#xff0c;并分享一些相关代码。 Axie Infinity&#xff08;亚龙无…

linux搭建seata并使用

搭建seata 官网 在linux下搭建 下载1.6.1版本&#xff1a;地址 新建文件夹、上传压缩包并解压 [roothao ~]# cd /usr/local/software/ [roothao /usr/local/software]# ls canal docker elk gitlab jdk mysql nacos nexus nginx rabbitmq redis redis_sentinel…

Jemeter,提取响应体中的数据:正则表达式、Json提取器

一、正则表达式 1、线程组--创建线程组&#xff1b; 2、线程组--添加--取样器--HTTP请求&#xff1b; 3、Http请求--添加--后置处理器--正则表达式提取器&#xff1b; 4、线程组--添加--监听器--查看结果树&#xff1b; 5、线程组--添加--取样器--调试取样器。 响应体数据…

ICC2:low power与pg strategy(pg_mesh)

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 用pg_strategy创建power stripe,示例如下: set pd_list {{DEFAULT_VA VDD_DIG VDD_DIG VSS} {PD_DSP VDD_DIG VDD_DSP VSS} } ;#两个电源域,DEFAULT_VA和PD_DSP是对应voltage area名字,其中D…

做数据分析为何要学统计学(6)——什么问题适合使用t检验?

t检验&#xff08;Students t test&#xff09;&#xff0c;主要依靠总体正态分布的小样本&#xff08;例如n < 30&#xff09;对总体均值水平进行差异性判断。 t检验要求样本不能超过两组&#xff0c;且每组样本总体服从正态分布&#xff08;对于三组以上样本的&#xff0…

2023/12/10总结

学习 WebSocket 一共四种方法&#xff0c;传递数据是要通过JSON格式传递 前端 onopen 在连接时 onmessage 收到消息时 通常携带参数 event &#xff0c;event.data 是消息 onerror 发生错误时 onclose 关闭连接时 发送消息 需要安装 vue-native-websocket 包 pnpm i vue-n…

数学建模算法

算法部分 1. 评价类模型2. TOPSIS3. 线性规划4. 聚类分析5. 预测模型6. 拉伊达准则(对异常值进行剔除)7. 数据拟合8. 图论代码练习1. 模拟圆周率2. 斐波那契数列3. 四只鸭子落在一个圆中概率4. 方程2: y" uy y,初值y(0) 1,y(0) 0 算法讲解 matlab代码大全 1. 评价类模型…

IP与以太网的转发操作

TCP模块在执行连接、收发、断开等各阶段操作时&#xff0c;都需要委托IP模块将数据封装成包发送给通信对象。 网络中有路由器和集线器两种不同的转发设备&#xff0c;它们在传输网络包时有着各自的分工。 (1)路由器根据目标地址判断下一个路由器的位置 (2)集线器在子网中将网…

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署&#xff0c;10月7日&#xff0c;杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单&#xff08;第二批&#xff09;。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业…

FFmpeg的AVFilter框架总成AVFilter-AVFilterContext

毫无疑问,还是和前面的一样一个context和一个包含有回调函数指针的插件结构体,想要实现自己的插件,主要实现里面的回调函数就可以了,当然,AVFilter比其它模块稍微复杂一点还要牵扯到其它一些辅助模块,在其它章节介绍 下面是关键函数调用图: /*** Add a frame to the bu…

用 CSS 写一个渐变色边框的输入框

Using_CSS_gradients MDN 多渐变色输入框&#xff0c;群友问了下&#xff0c;就试着写了下&#xff0c;看了看 css 渐变色 MDN 文档&#xff0c;其实很简单&#xff0c;代码记录下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

实验制备高纯酸PFA酸纯化器材质分析,SCH亚沸蒸馏器特点是什么

.酸纯化器&#xff1a;也称酸蒸馏器、高纯酸提取系统、酸纯化系统、亚沸腾蒸馏器、高纯酸蒸馏纯化器。常规实验室分析中&#xff0c;各种酸及试剂被广泛应用于日常的样品处理及分析中。那么应该选用什么材质的酸纯化器呢 氟塑料酸纯化器&#xff0c;提纯酸效果好&#xff0c;避…

12.11 C++ 作业

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

数据库 02-03补充 聚合函数--一般聚合分组和having

聚合函数&#xff1a; 01.一般的聚合函数&#xff1a; 举个例子&#xff1a; 一般聚合函数是用于单个元祖&#xff0c;就是返回一个数值。 02.分组聚合&#xff1a; 举个例子&#xff1a;