【每日一题】【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()){//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.mzph.cn/news/215579.shtml

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

相关文章

EXPLAIN 执行计划

有了慢查询语句后&#xff0c;就要对语句进行分析。一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划&#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访…

记录 DevEco 开发 HarmonyOS 应用开发问题记录 【持续更新】

HarmonyOS 应用开发问题记录 HarmonyOS 应用开发问题记录一、预览器无法成功运行?如何定位预览器无法编译问题? 开发遇到的问题 HarmonyOS 应用开发问题记录 一、预览器无法成功运行? 大家看到这个是不是很头疼? 网上能看到许多方案,基本都是关闭一个配置 但是他们并…

【Java SE】带你识别什么叫做异常!!!

&#x1f339;&#x1f339;&#x1f339;个人主页&#x1f339;&#x1f339;&#x1f339; 【&#x1f339;&#x1f339;&#x1f339;Java SE 专栏&#x1f339;&#x1f339;&#x1f339;】 &#x1f339;&#x1f339;&#x1f339;上一篇文章&#xff1a;【Java SE】带…

Android获取Wifi网关

公司有这样一个应用场景&#xff1a;有一台球机设备&#xff0c;是Android系统的&#xff0c;它不像手机&#xff0c;它没有触摸屏幕&#xff0c;所以我们对球机的操作很不方便&#xff0c;于是我们搞这样一个设置&#xff1a;点击球机电源键5次分享出一个热点&#xff0c;然后…

【JVM从入门到实战】(一) 字节码文件

一、什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。 JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 二、JVM的功能 解释和运行 对字节码文件中的指令&#xff0c;实时的解释成机器码&#xff0c;让计算机…

微信小程序:模态框(弹窗)的实现

效果 wxml <!--新增&#xff08;点击按钮&#xff09;--> <image classimg src"{{add}}" bindtapadd_mode></image> <!-- 弹窗 --> <view class"modal" wx:if"{{showModal}}"><view class"modal-conten…

差生文具多系列之最好看的编程字体

&#x1f4e2; 声明&#xff1a; &#x1f344; 大家好&#xff0c;我是风筝 &#x1f30d; 作者主页&#xff1a;【古时的风筝CSDN主页】。 ⚠️ 本文目的为个人学习记录及知识分享。如果有什么不正确、不严谨的地方请及时指正&#xff0c;不胜感激。 直达博主&#xff1a;「…

【文心一言】AI试用写代码体会:delphi、php

一、前言&#xff1a; 二、让【文心一言】编写一个函数 1. Delphi 语言&#xff08;文心一言的回复&#xff09; 2. php 语言&#xff08;文心一言回复&#xff09; 三、总结 一、前言&#xff1a; 众所周知&#xff0c;chatGPT是可以自动编写程序的&#xff0c;甚至可以运…

MyBatis缓存机制流程分析

前言 在进行分析之前&#xff0c;建议快速浏览之前写的理解MyBatis原理、思想&#xff0c;这样更容易阅读、理解本篇内容。 验证一级缓存 MyBatis的缓存有两级&#xff0c;一级缓存默认开启&#xff0c;二级缓存需要手动开启。 重复读取跑缓存 可以看到&#xff0c;第二次…

OpenAI承认GPT-4变懒,即将发布修复方案提升性能

目录 1OpenAI承认GPT-4变懒&#xff0c;即将发布修复方案提升性能 2一文秒懂人工智能全球近况 1OpenAI承认GPT-4变懒&#xff0c;即将发布修复方案提升性能 **划重点:** 1. &#x1f92f; 用户反馈:GPT-4使用者抱怨OpenAI破坏了体验&#xff0c;称模型几乎“害怕”提供答案。…

Wireshark使用技巧

Wireshark作为网络数据软件&#xff0c;功能强大&#xff0c;本专栏介绍仅为冰山一角&#xff0c;仅仅是一个入门级别的介绍&#xff0c;大部分功能还需要在日常工作中进行挖掘。 总结Wireshark软件的使用技巧如下&#xff1a; 1.合理部署Wireshark的位置&#xff0c;从源头保障…

基于Java SSM框架实现电影售票系统项目【项目源码+论文说明】

基于java的SSM框架实现电影售票系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(下)

DevExpress WPF的Side Navigation&#xff08;侧边导航&#xff09;、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar&#xff08;导航栏&#xff09;&#xff0c;DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

HTTP详解

1. web 1.1 web相关概念 软件架构 C /S&#xff1a;客户端/服务器端 需要安装客户端应用 B/S&#xff1a;浏览器/服务器端 不需要安装客户端应用&#xff0c;对于用户来说只需要记住域名访问就可以,高效,客户端零维护 资源分类 静态资源&#xff1a;所有用户访问后&#x…

数据库系统原理与实践 笔记 #12

文章目录 数据库系统原理与实践 笔记 #12事务管理和并发控制与恢复(续)并发控制SQL-92中的并发级别基于锁的协议基于锁的协议的隐患锁的授予封锁协议两阶段封锁协议多粒度粒度层次的例子意向锁类型相容性矩阵多粒度封锁模式基于时间戳的协议基于时间戳协议的正确性基于有效性检…

怎样在PPT中加入音频文件?记好这4个简单操作!

“我要制作一个比较专业的PPT来汇报工作成果&#xff0c;想在PPT里加一段音乐&#xff0c;但是不知道应该如何操作&#xff0c;有没有朋友可以指导一下呢&#xff1f;” PPT作为一种常用的文件形式&#xff0c;很多用户会将其用于工作汇报&#xff0c;期末总结以及各种演讲。在…

六级高频词组2

目录 词组 参考链接 词组 51. arise from&#xff08;be caused by&#xff09; 由…引起。 52. arrange for sb.sth. to do sth. 安排…做… 53. arrive on 到达&#xff1b; arrive at 到达某地&#xff08;小地方&#xff09;&#xff1b;得出&#xff0c;作出&#x…

zookeeper基础内容

文章目录 Zookeeper基础概述数据结构Zookeeper节点操作zookeeper节点操作命令数据模型 znode 结构 zookeeper java客户端ZooKeeper原生APICuratorzkClient对比总结 Zookeeper基础 概述 zookeeper&#xff08;分布式协调服务&#xff09; 本质&#xff1a;小型的文件存储系统监…

Springboot内置Tomcat线程数优化

Springboot内置Tomcat线程数优化 # 等待队列长度&#xff0c;默认100。队列也做缓冲池用&#xff0c;但也不能无限长&#xff0c;不但消耗内存&#xff0c;而且出队入队也消耗CPU server.tomcat.accept-count1000 # 最大工作线程数&#xff0c;默认200。&#xff08;4核8g内存…