leetcode 1631.最小体力消耗路径

思路:BFS+二分

这道题和洛谷上的那个"汽车拉力赛"那道题很相似,但是这道题相较于洛谷那个来说会简单一些。

这里作者一开始写的时候思路堵在了怎么在BFS中用二分,先入为主的以为需要先写出来搜索函数然后再去处理二分的事,但是这里是先二分找数,然后再搜索才是对的。所以先入为主之后就没有做出来。

注意:需要注意数据范围,另外,每一次更新mid数值的时候,我们上一次已经搜索过的数组,队列等存储单元都需要清空,不然的话会影响后面的输出结果。还有,二分注意用哪一个模板,选择也是很重要的。这里主要是求最小值,所以是(left+right)/2而不是(left+right+1)/2,还有就是while中不要left<=right,你用范围的二分查找会造成死循环,但是用于基本的找数是可以的。

复制代码
class Solution {
public:
    int minimumEffortPath(vector<vector<int>>& heights) {
        int dx[4]={1,-1,0,0};
        int dy[4]={0,0,1,-1};
        int left=0;
        int right=1000000;
        while(left<right){
            queue<pair<int,int>>q;
            q.push({0,0});
            vector<vector<bool>>st(heights.size(),vector<bool>(heights[0].size(),false));
            st[0][0]=true;
            int mid=(left+right)/2;
        while(!q.empty()){
            auto tmp=q.front();
            q.pop();
            for(int i=0;i<4;i++){
                int a=dx[i]+tmp.first;
                int b=dy[i]+tmp.second;
                if(a>=heights.size()||a<0||b<0||b>=heights[0].size())continue;
                if(st[a][b])continue;
                if(abs(heights[a][b]-heights[tmp.first][tmp.second])>mid)continue;

                q.push({a,b});
                st[a][b]=true;
            }
        }
        if(st[heights.size()-1][heights[0].size()-1])
        {
            right=mid;
        }
        else
        {
            left=mid+1;
        }
        }
        return right;
    }
};
相关推荐
久菜盒子工作室8 分钟前
面试经验|产品经理|自我介绍
面试·职场和发展·产品经理
cpp_250113 分钟前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
Hugh-Yu-13012317 分钟前
二元一次方程组求解器c++代码
开发语言·c++·算法
编程大师哥41 分钟前
C++类和对象
开发语言·c++·算法
加农炮手Jinx1 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
Rabitebla1 小时前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法
加农炮手Jinx1 小时前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣
旖-旎1 小时前
递归(汉诺塔问题)(1)
c++·学习·算法·leetcode·深度优先·递归
深邃-1 小时前
【数据结构与算法】-顺序表链表经典算法
java·c语言·数据结构·c++·算法·链表·html5
努力学习的小廉1 小时前
我爱学算法之—— 前缀和(上)
c++·算法