Leetcode.1631 最小体力消耗路径

news2024/11/17 3:33:46

题目链接

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

题目描述

你准备参加一场远足活动。给你一个二维 rows x columns的地图 heights,其中 heights[row][col]表示格子 ( r o w , c o l ) (row, col) (row,col) 的高度。一开始你在最左上角的格子 ( 0 , 0 ) (0, 0) (0,0) ,且你希望去最右下角的格子 ( r o w s − 1 , c o l u m n s − 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
解释:上图所示路径不需要消耗任何体力。

提示:

  • r o w s = = h e i g h t s . l e n g t h rows == heights.length rows==heights.length
  • c o l u m n s = = h e i g h t s [ i ] . l e n g t h columns == heights[i].length columns==heights[i].length
  • 1 < = r o w s , c o l u m n s < = 100 1 <= rows, columns <= 100 1<=rows,columns<=100
  • 1 < = h e i g h t s [ i ] [ j ] < = 1 0 6 1 <= heights[i][j] <= 10^6 1<=heights[i][j]<=106

解法:二分 + bfs

将原问题抽象为:

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

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

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

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

时间复杂度: O ( m n ∗ l o g r ) 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.coloradmin.cn/o/419857.html

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

相关文章

8.Java面向对象---类、属性和方法

Java面向对象—类、属性和方法 在生活中&#xff0c;说到类&#xff0c;可以联想到类别&#xff0c;同类&#xff0c;会想到一类人&#xff0c;一类事物等等。而这一类人或事物都是具有相同特征或特点和行为的&#xff0c;我们根据不同的特征或特点和行为将他们归类或分类。同…

ActiveReportsJS 4.0 FIX ActiveReportsJS 4.0 Crack

JavaScript 报告工具是一组用于数据整合和可视化的 Web 组件。ActiveReportsJS 是前端开发人员用来在 Web 应用程序中嵌入报告的解决方案。报表设计器和查看器组件、强大的数据可视化器和丰富的 API 等主要功能使 ActiveReportsJS 成为行业领导者。 JavaScript 报告引擎 利用强…

【算法与数据结构】2 梅开二度,线性查找的究极优化

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越 线性查找的究极优化1.前言2.泛型1.1粗略介绍泛型类1.2使用泛型方法1…

Python 中如果键不存在,则将键添加到字典

文章目录使用 not in 检查键是否存在如果字典不存在则使用 dict.get() 添加键到字典如果字典不存在&#xff0c;则使用 setdefault() 将键添加到字典中使用 not in 检查键是否存在 如果字典不存在&#xff0c;则将键添加到字典中&#xff1a; 使用 not in 运算符检查键是否不…

如何用ChatGPT写文章?只需要这3步,10倍提升写作效率

随着技术的不断进步和创新&#xff0c;我们的生活方式和工作方式也在不断变化。在日常工作中&#xff0c;越来越多的人使用人工智能和机器学习等技术提高效率减少时间成本。最近ChatGPT火出圈了&#xff0c;很多人通过使用ChatGPT提高了工作效率。那么&#xff0c;在写作领域&a…

【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点 p269 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ 1. 题目介绍&#xff08; 54. 二叉搜索树的第k大节点&#xff09; 给定一棵二叉搜索树&#xff0c;请找出其中第 k 大的节点的值。 【测试用例】&#xff1a; 示例 1: 示例2&…

UTONMOS:打造你的梦想,开启元宇宙无限彩排的游戏时代

有人认为&#xff0c;元宇宙不过是 VR 概念的“旧瓶换新酒式”的炒作。 有人认为&#xff0c;元宇宙是被资本和巨头绑架的另一场“游戏”。 有人认为&#xff0c;元宇宙是骗局&#xff0c;是智商税。 更多人对元宇宙的评价是“呵呵”。 媒体朋友对元宇宙的描述更具艺术性&a…

详解FreeRTOS中的软件定时器

软件定时器用于让某个任务定时执行&#xff0c;或者周期性执行。比如设定某个时间后执行某个函数&#xff0c;或者每隔一段时间执行某个函数。由软件定时器执行的函数称为软件定时器的回调函数。 参考资料&#xff1a; 《Mastering the FreeRTOS™ Real Time Kernel》——Cha…

vue2、vue3使用i18n实现国际化

一、目标效果 源码地址&#xff1a;git clone i18n-demo: vue2、vue3实现i18n国际化功能 默认语言是中文&#xff1a; 点击语言切换&#xff0c;变成英文&#xff08;这里简单设置了中文、英文两种语言&#xff09; 注意&#xff1a;vue2支持 vue-i18n 版本8.0 &#xff0c;vu…

本轮沙尘已跨过长江!这些地区请注意加强防范

气象台4月12日06时继续发布沙尘暴蓝色预警&#xff1a;受冷空气大风影响&#xff0c;预计4月12日08时至13日08时&#xff0c;新疆南疆盆地和东部、内蒙古中西部、甘肃河西和中部、宁夏、陕西中部、山西、河北、辽宁、北京、天津、山东、河南、安徽、江苏、上海、湖北中北部、浙…

漏洞利用之弱口令

漏洞利用之弱口令1.弱口令的定义2.弱口令字典生成收集用户信息&#xff0c;组成爆破字典特殊字符增强的字典生成字典生成项目3.利用 Burp Suite 进行密码爆破1.弱口令的定义 弱口令没有严格和准确的定义&#xff0c;通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令…

【Mysql】mysql8.0.26解压包部署方式

版本背景&#xff1a; 操作系统&#xff1a;centos7.3 mysql版本&#xff1a;mysql-8.0.26-linux-glibc2.12-x86_64.tar 一、前期准备 1、检测操作系统自带安装的mysql和mariadb服务&#xff0c;如存在&#xff0c;需卸载 rpm -qa | grep mysql rpm -qa | grep mariadb 卸载…

vim编辑器使用

目录 vim基本概念 vim基本操作 插入模式 命令模式 移动光标 删除字符 复制剪切 替换 撤销 更改 移动指定行 底行模式 命令集 vim简单配置 vim基本概念 vim编辑器有三种模式&#xff1a; 命令模式&#xff1a;光标移动&#xff0c;字符或行移动&#x…

iTOP-RK3568开发板Android kernel移植-单独编译内核

此方法常用于 kernel 的开发和调试&#xff0c;以下的方法既编译 kernel 部分时&#xff0c; 同 时打包成 boot.img&#xff0c; 这样加快了我们开发的速度&#xff1b; 进入内核目录下&#xff0c; 输入以下命令&#xff1a; cd kernel make ARCHarm64 CC../prebuilts/cla…

Vue:axios

1、 第三方库方式&#xff0c; 基于 Promise 的 HTTP 库&#xff1a;axios &#xff08;对 XMLHttpRequest进行的封装&#xff09; 即&#xff1a; axios.get().then() 2、跨域访问 定义&#xff1a;在 a 页面中想获取 b 页面中的资源&#xff0c;如果 a 页面和 b 页面所处的协…

Java基础从入门到精通系列(一)

1、Java简介 Java语言是一种高级、并发、面向对象的计算机编程语言&#xff0c;由Sun Microsystems公司于1995年推出。Java广泛应用于Web应用程序开发、移动应用程序开发以及大型企业级应用程序的开发中。Java语言具有跨平台、安全性好、可移植性强、易学易用等优点&#xff0…

JavaSE学习进阶day04_01 Date类

第一章 Date类 首先对时间的几个补充有必要知道&#xff1a; 时间起点&#xff1a; 心得&#xff1a; 如果以后我们仅仅要展示时间&#xff0c;那么可以用Date和SimpleDateFormat&#xff08;格式化&#xff09; 如果我们要拿着两个时间进行计算&#xff0c;用Date和SimpleD…

【C++升级之路】第十二篇:模板进阶 | 非类型模板参数 模板特化 类模板的分离编译 模板优缺点总结

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;非类型模板参数&#xff0c;函数模板特化&#xff0c;类模板特化&#xff08;全特化&#xff0c;部分特化&a…

【系统集成项目管理工程师】信息系统集成专业知识

信息系统集成专业技术 一 信息系统建设 1 信息系统生命周期 立项阶段&#xff1a;即概念阶段或需求阶段&#xff0c;这一阶段根据用户业务发展和经营管理的需要&#xff0c;提出建设信息系统的初步构想&#xff0c;然后对企业信息系统的需求进行深入调研和分析&#xff0c;形…

K8s结合docker部署

原生安装步骤 安装必要的环境依赖与工具 sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release下载证书更新 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-key…