【LeetCode:1631. 最小体力消耗路径 | BFS + 二分】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

在这里插入图片描述

🚩 题目链接

⛲ 题目描述

你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 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.length
columns == heights[i].length
1 <= rows, columns <= 100
1 <= heights[i][j] <= 106

🌟 求解思路&实现代码&运行结果


⚡ BFS + 二分

🥦 求解思路
  1. 首先,求解这道题目的思路应该是先通过BFS和DFS来求解,发现超时,不能求解,然后在此基础上进行后续的优化。
  2. 我们不妨将问题转换为,是否存在一条从左上角到右下角的路径,其经过的所有数值的最大值不超过target?如果存在,右边界缩小,反之,左边界扩大,正好通过二分求解该过程。
  3. 实现代码如下所示:
🥦 实现代码
class Solution {

    int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    public int minimumEffortPath(int[][] heights) {
        int m=heights.length;
        int n=heights[0].length;
        int left=-1;
        int right=1000000;
        while (left+1<right) {
            int mid=(left+right) / 2;
            Queue<int[]> queue=new LinkedList<int[]>();
            queue.offer(new int[]{0, 0});
            boolean[][] flag=new boolean[m][n];
            flag[0][0]=true;
            while (!queue.isEmpty()) {
                int[] temp=queue.poll();
                int x=temp[0], y=temp[1];
                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&&!flag[nx][ny]&&Math.abs(heights[x][y]-heights[nx][ny])<=mid) {
                        queue.add(new int[]{nx, ny});
                        flag[nx][ny]=true;
                    }
                }
            }
            if(flag[m-1][n-1]){
                right=mid;
            }else{
                left=mid;
            }
        }
        return right;
    }
}
🥦 运行结果

在这里插入图片描述

⚡ 其它解法

  1. 并查集。
  2. 最短路径算法。
  3. 后续补充完善。。。

💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值