leetcode 1631. 最小体力消耗路径 二分+BFS、并查集、Dijkstra算法

最小体力消耗路径

在这里插入图片描述
题目与水位上升的泳池中游泳类似

二分查找+BFS

首先,采用二分查找,确定一个体力值,再从左上角,进行BFS,查看能否到达右下角,如果不行,二分查找就往大的数字进行查找,如果可以,还要继续往小的数字进行查找,比如示例1,数字10肯定可以到达右下角,但不是最小的体力。

class Solution {
   
public:
    int dx[4] = {
    0,0,-1,1 };
    int dy[4] = {
    -1,1,0,0 };
    int m, n;
    bool bfs(vector<vector<int>>& heights, vector<vector<int>> exist, int sub)//二分+BFS
    {
   
        exist[0][0] = 1;
        queue<pair<int, int>> q;
        q.emplace(0, 0);

        while (!q.empty())
        {
   
            auto [i, j] = q.front();
            q.pop();

            for (int k = 0; k < 4; ++k)//上下左右四个方向
            {
   
                int newi = i + dx[k];
                int newj = j + dy[k];
                if (newi >= 0 && newi < m && newj >= 0 && newj < n && !exist[newi][newj] && sub >= abs(heights[i][j] - heights[newi][newj]))
                {
   
                    exist[newi][newj] = 1;

                    if (newi == m - 1 && newj == n - 1)//到达右下角
                    {
   
                        return true;
                    }

                    q.emplace(newi, newj);
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值