力扣每日一题 ---- 1970. 你能穿过矩阵的最后一天

这题对于没怎么做到过这题的朋友来说比较陌生,他给出的条件是两个都是动态的条件,一个条件随着另一个条件走,这个时候是很熟悉这题的朋友就会感觉比较麻烦,比较难,就不想写了,两个强相关条件的第一个是水每天都会增加,第二个条件是你每天都可以走,本题主要解决的就是这两个条件,那么本题的条件虽然是两个强相关联的,但是在计算机中一般都可以拆解成弱相关联的条件,我们发现一个特点就是,水每天是不会变化,而每天怎么都是有很多中情况的,那么这样就知道一个定性条件就是水每天不会变化,那么通过水每天不会变化,那么我们就知道可以先枚举每天前几天水的状态,判断能否到达最后一行,还有一个细节就是本题要求的是最少天数能到达最后一行,这个最少我们该怎么判断呢?用动态规划吗,那太麻烦了,我们知道一个条件,边长为1下可以用bfs,bfs搜到的第一个点就是最少的天数,目前我们知道枚举水的状态,bfs,那么时间是多少呢?会超时,那么我们下一步考虑的就是该怎么优化这题呢?那么其实根据经验我们试一下二分,发现二分水的状态可以,那么就可以二分水的状态bfs就可以了。

cpp 复制代码
class Solution {
private:
    static constexpr int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

public:
    int latestDayToCross(int row, int col, vector<vector<int>>& cells) {
        int left = 0, right = row * col, ans = 0;
        while (left <= right) {
            int mid = (left + right) / 2;
            
            vector<vector<int>> grid(row, vector<int>(col, 1));
            for (int i = 0; i < mid; ++i) {
                grid[cells[i][0] - 1][cells[i][1] - 1] = 0;
            }

            queue<pair<int, int>> q;
            for (int i = 0; i < col; ++i) {
                if (grid[0][i]) {
                    q.emplace(0, i);
                    grid[0][i] = 0;
                }
            }
            bool found = false;
            while (!q.empty()) 
            {
                auto [x, y] = q.front();
                q.pop();
                 if (x == row - 1) {
                    found = true;
                    break;
                }
                for (int d = 0; d < 4; ++d) {
                    int nx = x + dirs[d][0];
                    int ny = y + dirs[d][1];
                    if (nx >= 0 && nx < row && ny >= 0 && ny < col && grid[nx][ny]) {

                        q.emplace(nx, ny);
                        grid[nx][ny] = 0;
                    }
                }
            }
            if (found) {
                ans = mid;
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        return ans;
    }
};
相关推荐
WolfGang0073212 分钟前
代码随想录算法训练营Day28 | 509.斐波那契数列、70.爬楼梯、746.使用最小花费爬楼梯
算法
Boop_wu6 分钟前
[Java EE] 多线程进阶(JUC)(2)
java·jvm·算法
闻缺陷则喜何志丹1 小时前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
CoovallyAIHub1 小时前
如何在手机上轻松识别多种鸟类?我们发现了更简单的秘密……
深度学习·算法·计算机视觉
第二只羽毛1 小时前
遵守robots协议的友好爬虫
大数据·爬虫·python·算法·网络爬虫
艾斯比的日常1 小时前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
CoovallyAIHub2 小时前
抛弃LLM!MIT用纯视觉方法破解ARC难题,性能接近人类水平
深度学习·算法·计算机视觉
程序猿编码2 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
高洁012 小时前
具身智能-视觉语言导航(VLN)
深度学习·算法·aigc·transformer·知识图谱
Hacker_Oldv2 小时前
API 自动化测试难点总结与分享
自动化测试·软件测试·职场和发展