LeetCode 1631. 最小体力消耗路径——Java(二分+BFS)

该博客讨论了一种混合算法,将广度优先搜索(BFS)与二分查找相结合来解决寻找从地图左上角到右下角的最小体力消耗路径的问题。题目中,体力值由相邻格子之间的高度差绝对值的最大值决定。博主通过创建一个二维数组记录已访问的节点,并使用队列进行BFS搜索,同时用二分查找优化搜索范围,最终找到了一条路径,其最大高度差不超过给定阈值。
摘要由CSDN通过智能技术生成

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

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

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

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

头一次做二分和BFS结合的题,适应一下…

class Solution {
    int[] X = new int[]{0,-1,1,0};
    int[] Y = new int[]{1,0,0,-1};
    public int minimumEffortPath(int[][] heights) {
        int l = 0,r = 1000000;
        while(l < r){
            int mid = (l+r)/2;
            if(check(mid,heights)){
                r = mid;
            }else{
                l = mid+1;
            }
        }
        return r;
    }
    public boolean check(int mid,int[][] heights){
        boolean[][] vis = new boolean[102][102];
        Queue<A> q = new LinkedList<>();
        q.offer(new A(0,0));
        vis[0][0] = true;
        while(!q.isEmpty()){
            A top = q.poll();
            int x = top.x;
            int y = top.y;
            if(x == heights.length-1 && y == heights[0].length-1){
                return true;
            }
            for(int i = 0;i<4;i++){
                int newX = x+X[i];
                int newY = y+Y[i];
                if(newX>=0 && newX<heights.length && newY>=0 && vis[newX][newY] == false && newY<heights[0].length && Math.abs(heights[x][y]-heights[newX][newY]) <= mid){
                    vis[newX][newY] = true;
                    q.offer(new A(newX,newY));
                }
            }
        }
        return false;
    }
}
class A{
    int x;
    int y;
    public A(int x,int y){
        this.x = x;
        this.y = y;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Uranus^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值