Leetcode.1631 最小体力消耗路径

news/2024/11/8 16:54:23/

题目链接

Leetcode.1631 最小体力消耗路径 Rating : 1948

题目描述

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

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

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

示例 1:

在这里插入图片描述

输入:heights = [[1,2,2],[3,8,2],[5,3,5]]
输出:2
解释:路径 [1,3,5,3,5] 连续格子的差值绝对值最大为 2 。
这条路径比路径 [1,2,2,2,5] 更优,因为另一条路径差值最大值为 3 。

示例 2:

在这里插入图片描述

输入:heights = [[1,2,3],[3,8,4],[5,3,5]]
输出:1
解释:路径 [1,2,3,4,5] 的相邻格子差值绝对值最大为 1 ,比路径 [1,3,5,3,5] 更优。

示例 3:

在这里插入图片描述

输入:heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
输出:0
解释:上图所示路径不需要消耗任何体力。

提示:

  • rows==heights.lengthrows == heights.lengthrows==heights.length
  • columns==heights[i].lengthcolumns == heights[i].lengthcolumns==heights[i].length
  • 1<=rows,columns<=1001 <= rows, columns <= 1001<=rows,columns<=100
  • 1<=heights[i][j]<=1061 <= heights[i][j] <= 10^61<=heights[i][j]<=106

解法:二分 + bfs

将原问题抽象为:

  • 将每个格子抽象成图中的一个点;

  • 将每两个相邻的格子之间连接一条边,长度为这两个格子本身 权值的差的绝对值

  • 原问题转化为求 左上角 到 右下角的最短路径(路径长度为整条路径上的最大的那个权值

我们可以 二分 边的权值 midmidmid ,即 ≤mid\leq midmid 的边才将其联通。最后我们判断从起点 (0,0)(0,0)(0,0) 能否到 终点(m−1,n−1)(m-1,n-1)(m1,n1)即可。

时间复杂度:O(mn∗logr)O(mn * logr)O(mnlogr)

C++代码:


using PII = pair<int,int>;class Solution {static constexpr int dir[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};
public:int minimumEffortPath(vector<vector<int>>& g) {int m = g.size() , n = g[0].size();int l = 0 , r = 1e6;while(l < r){int mid = (l + r) >> 1;//判断位置是否被方问过了vector<bool> st(m * n);queue<PII> q;//起点入队q.emplace(0,0);st[0] = true;while(!q.empty()){auto [x,y] = q.front();q.pop();for(int i = 0;i < 4;i++){int dx = x + dir[i][0] , dy = y + dir[i][1];if(dx < 0 || dx >= m || dy < 0 || dy >= n) continue;if(st[dx * n + dy] || abs(g[x][y] - g[dx][dy]) > mid) continue;st[dx * n + dy] = true;q.emplace(dx,dy);}}if(st[m * n - 1]) r = mid;else l = mid + 1;}return l;}
};

http://www.ppmy.cn/news/40544.html

相关文章

MySQL having关键字详解、与where的区别

1、having关键字概览 1.1、作用 对查询的数据进行筛选 1.2、having关键字产生的原因 使用where对查询的数据进行筛选时&#xff0c;where子句中无法使用聚合函数&#xff0c;所以引出having关键字 1.3、having使用语法 having单独使用&#xff08;不与group by一起使用&…

window11使用yarn安装@vue/cli vue-V显示不是内部命令

配置环境变量 yarn global dir查看路径 找到node_modules下的bin

Spring(Ioc和Bean的作用域)

Spring Spring为简化开发而生&#xff0c;让程序员只关心核心业务的实现&#xff0c;尽可能的不在关注非业务逻辑代码&#xff08;事务控制&#xff0c;安全日志等&#xff09;。 1&#xff0c;Spring八大模块 这八大模块组成了Spring 1.1 Spring Core模块 这是Spring框架的…

VR全景乡村,VR全景,身临其境,感受自然

随着科技的不断发展&#xff0c;人们对于旅游体验的需求也在不断提升。而传统的旅游方式&#xff0c;虽然能够让人们亲身感受到自然风光和人文景观的美丽&#xff0c;但却难以完全满足人们对于旅游的多元化需求。而VR全景乡村这种全新的乡村旅游体验方式&#xff0c;则为人们带…

Golang中的JSON使用技巧

我们使用Golang开发后台时&#xff0c;经常会和JSON打交道&#xff0c;使用JSON主要是使用官方的encoding/json库&#xff0c;这里介绍一些和json库相关的使用技巧 关于性能 传说中老有人说官方库性能不算很好&#xff0c;有更好的选择&#xff0c;但我们基本的场景都感觉不到…

Pandas 秘籍:1~5

原文&#xff1a;Pandas Cookbook 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 一、Pandas 基础 在本章中&#xff0c;我们将介绍以下内容&#xff1a; 剖析数据帧的结构访问主要的数据帧组件了解数据类型选择单列数据作为序列调用序列方法与运算符一起使用序列将…

思科ASA防火墙: 接口配置名称 安全等级 acl防控列表

环境&#xff1a;上图环境 win10 内 ip&#xff1a;192.168.1.1 /24 网关 &#xff1a; 192.168.1.254 win10 外 ip&#xff1a; 172.12.12.1 /24 网关 &#xff1a;172.12.12.254 asa e0/0接口 &#xff1a; 192.168.1.254 e0/1 接口 &#xff1a; 172…

TCP并发服务器模型

文章目录1. 循环服务器2. 并发服务器2.1 多进程并发服务器2.2 多线程并发服务器3. 基于TCP的文件传输服务(目前只有下载)1.tftp下载模型2.TFTP通信过程总结3.tftp下载协议分析1. 循环服务器 一次只能处理一个客户端&#xff0c;等这个客户端退出后&#xff0c;才能处理下一个客…