Leetcode 1631. 最小体力消耗路径

news/2024/10/5 11:17:00

1.题目基本信息

1.1.题目描述

你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。

一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。

请你返回从左上角走到右下角的最小 体力消耗值 。

1.2.题目地址

https://leetcode.cn/problems/path-with-minimum-effort/description/

2.解题方法

2.1.解题思路

二分查找你+广度优先搜索

2.2.解题步骤

第一步,初始化体力消耗值的边界值,最小为0,最大为106-1(因为height值<=106)

第二步,定义check函数,判断体力值HP是否能完成从左上角到右下角的任务,使用广度有效搜索的方法判断是否能到达

第三步,红蓝染色法特征定义。红:在当前体力消耗值a下,不能完成从左上角到右下角的任务的项,蓝:在当前体力消耗值下,能完成任务的项。左闭右闭:left-1始终指向红色,right+1始终指向蓝色。最终的left和right+1即为最小体力消耗值

3.解题代码

Python代码

from collections import dequeclass Solution:# 二分查找你+广度优先搜索def minimumEffortPath(self, heights: List[List[int]]) -> int:rows,cols=len(heights),len(heights[0])# 第一步,初始化体力消耗值的边界值,最小为0,最大为10**6-1(因为height值<=10**6)# 第二步,定义check函数,判断体力值HP是否能完成从左上角到右下角的任务,使用广度有效搜索的方法判断是否能到达# 第三步,红蓝染色法特征定义。红:在当前体力消耗值a下,不能完成从左上角到右下角的任务的项,蓝:在当前体力消耗值下,能完成任务的项。左闭右闭:left-1始终指向红色,right+1始终指向蓝色。最终的left和right+1即为最小体力消耗值def check(hitPoint):# 检查在体力hitPoint下能否完成从左上角到右下角的任务que=deque([(0,0)])seen=set([(0,0)])while que:for i in range(len(que)):item=que.popleft()# 注意:在一定条件下,这里可以往左和上走for direct in [[0,1],[1,0],[-1,0],[0,-1]]:nextPoint=(item[0]+direct[0],item[1]+direct[1])if 0<=nextPoint[0]<rows and 0<=nextPoint[1]<cols and abs(heights[nextPoint[0]][nextPoint[1]]-heights[item[0]][item[1]])<=hitPoint and nextPoint not in seen:que.append(nextPoint)seen.add(nextPoint)return (rows-1,cols-1) in seenleft,right=0,10**6-1while left<=right:mid=(right-left)//2+leftif not check(mid):left=mid+1else:right=mid-1return left

C++代码

class Solution {
public:int directions[4][2]={{0,1},{1,0},{-1,0},{0,-1}};bool check(int hitPoint,vector<vector<int>>& heights){int rows=heights.size(),cols=heights[0].size();queue<pair<int,int>> que;que.emplace(0,0);vector<int> seen(rows * cols);seen[0] = 1;while(!que.empty()){for(int i=0;i<que.size();++i){auto item=que.front();que.pop();for(auto direct:directions){int nextX=item.first+direct[0];int nextY=item.second+direct[1];int val=nextX*cols+nextY;if(0<=nextX && nextX<rows && 0<=nextY && nextY<cols && abs(heights[nextX][nextY]-heights[item.first][item.second])<=hitPoint && !seen[val]){que.emplace(nextX,nextY);seen[val] = 1;}}}}return true ? seen[rows*cols-1]==1 : false;}int minimumEffortPath(vector<vector<int>>& heights) {int left=0,right=999999;while(left<=right){int mid=(right-left)/2+left;if(!check(mid,heights)){left=mid+1;}else{right=mid-1;}}return left;}
};

4.执行结果

在这里插入图片描述

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

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

相关文章

使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters 本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBase、V…

【Shiro】3.Springboot实现缓存

最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache 实现缓存 集成 Redis 实现 Shiro 缓存(推荐使用)在此之前,我们已经简单学会EhCache 和Reids的使用。 EhCa…

织梦如何数据库备份,织梦cms网站数据怎么备份与还原

织梦CMS(DedeCMS)的数据库备份和还原是非常重要的操作,可以帮助你在出现问题时快速恢复数据。下面详细介绍如何进行织梦CMS的数据库备份和还原。 一、数据库备份 1. 使用 phpMyAdmin 备份数据库登录 phpMyAdmin登录到你的网站控制面板(如 cPanel)。 找到并打开 phpMyAdmin…

【软考】3 校验码

校验码 码距概念:任意进制的两个码值之间的最小二进制位数称为校验码的码距 例如:二进制1bit位,从0到1,则码距是1,二进制2bit位 从 00 到 11 一共4个码字,但码距还是为1 可以设置 性别男为 00 女为 11两个合法码字,则该两个合法码字的最小码距为2 (间隔 01 和 10 两个)…

IOU指标

IOU:全称 intersection over union 交并比,两个区域真实框和预测框之间的交集比他们之间的总面积-交集的 IOU指标:通常用于评估计算机视觉任务中的模型性能,特别是目标检测和图像分割。一个较高的IoU值意味着模型的定位和分割精度更好。

查找和管理数据库的具体步骤

登录MySQL命令行使用SSH连接到服务器。 登录MySQL命令行:bashmysql -u root -p输入MySQL root用户的密码。查看数据库列表在MySQL命令行中查看所有数据库:sqlSHOW DATABASES;选择织梦CMS数据库选择织梦CMS使用的数据库:sqlUSE dedecmsv56gbk;查看数据库表查看织梦CMS数据库中…

DedeCMS Error Track:DedeCMS错误警告:连接数据库失败

当织梦CMS(DedeCMS)出现“连接数据库失败”的错误时,可以通过以下几个步骤进行排查和解决: 1. 检查数据库配置文件打开配置文件打开织梦CMS的数据库配置文件 include/config.inc.php。 使用FTP工具或SSH连接到服务器,然后打开该文件。检查配置信息确认数据库配置信息是否正…

SpringMVC内容

SpringMVC简介 SpringMVC(Model View Controller) 是以Servlet API为基础的 Web 框架并可以部署到 Servlet容器(比如:Tomcat),是控制层框架,主要负责与前端交互,接收前端的参数,在服务层进行交互,并把结果返回会前端页面。 SpringMVC工作原理当发送请求的时候,Dis…