【每日一题】【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,一经查实,立即删除!

相关文章

PHP基础(2)

目录 一、PHP 数据类型 二、PHP 字符操作函数 strlen() str_word_count() strrev() strpos() str_replace() 一、PHP 数据类型 PHP 有八种基本数据类型和两种复合数据类型&#xff1a; 整型&#xff08;int&#xff09;&#xff1a;表示整数&#xff0c;可以是正数或负数&am…

线程Thread源代码思想学习1

1.启动线程代码 public class MultiThreadExample {public static void main(String[] args) {// 创建两个线程对象Thread thread1 new Thread(new Task());Thread thread2 new Thread(new Task());// 启动线程thread1.start();thread2.start();} }class Task implements Ru…

EXPLAIN 执行计划

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

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

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

InitializingBean初始化--Spring容器管理

目录 InitializingBean--自动执行一些初始化操作spring初始化bean有两种方式&#xff1a;1.优点2.缺点2.PostConstruct 注解2.举例使用InitializingBean接口 和PostConstruct3.初始化交给容器管理4.与main入口函数有什么区别5.在 Spring 中&#xff0c;有两种主要的初始化 bean…

【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;让计算机…

C++类模板不是一开始就创建的,而是调用时生成

类模板中的成员函数和普通类中成员函数创建时机有区别的&#xff1a; 普通类中的成员函数一开始就可以创建模板类中的成员函数调用的时候才可以创建 总结;类模板中的成员函数并不是一开始就创建的&#xff0c;再调用时才去创建 #include<iostream> using namespace st…

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

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

Vue中$props、$attrs和$listeners的使用详解

文章目录 透传属性如何禁止“透传属性和事件”多根节点设置透传访问“透传属性和事件” $props、$attrs和$listeners的使用详解 透传属性 透传属性和事件并没有在子组件中用props和emits声明透传属性和事件最常见的如click和class、id、style当子组件只有一个根元素时&#xf…

jOOQ指南中使用的数据库

jOOQ指南中使用的数据库 本指南中使用的数据库将在本节中进行总结和创建 使用Oracle方言来创建 # 创建语言 CREATE TABLE language (id NUMBER(7) NOT NULL PRIMARY KEY,cd CHAR(2) NOT NULL,description VARCHAR2(50) );# 创建作者 CREATE TABLE author (id NUMBER(7) NOT …

mysql:需要准确存储的带小数的数据,要使用DECIMAL类型

需要准确存储的带小数的数据&#xff0c;要使用DECIMAL&#xff0c;特别是涉及金钱类的业务。而不要使用FLOAT或者DOUBLE。 因为DECIMAL是准确值&#xff0c;不会损失精度。 而FLOAT或者DOUBLE是近似值&#xff0c;会损失精度。 https://dev.mysql.com/doc/refman/8.2/en/fixe…

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

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

数据结构 | Floyd

参考博文&#xff1a; floyd算法 弗洛伊德算法 多源最短路径算法_弗洛伊德算法例题-CSDN博客

【文心一言】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;管理工作的重要性已逐渐被人们所认识&#…