码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 算法刷题第九天:广度优先搜索 / 深度优先搜索--3


    目录

    一,01矩阵

     题解在这:

    二,腐烂的橘子

    1,多源广度优先搜索

    思路

    复杂度分析

    一,01矩阵

    542. 01 矩阵 - 力扣(LeetCode)https://leetcode.cn/problems/01-matrix/?plan=algorithms&plan_progress=gzwnnxs

     题解在这:

    01矩阵 - 01 矩阵 - 力扣(LeetCode)https://leetcode.cn/problems/01-matrix/solution/01ju-zhen-by-leetcode-solution/

    二,腐烂的橘子

    994. 腐烂的橘子 - 力扣(LeetCode)https://leetcode.cn/problems/rotting-oranges/?plan=algorithms&plan_progress=gzwnnxs

    1,多源广度优先搜索


    思路

    观察到对于所有的腐烂橘子,其实它们在广度优先搜索上是等价于同一层的节点的。

    假设这些腐烂橘子刚开始是新鲜的,而有一个腐烂橘子(我们令其为超级源点)会在下一秒把这些橘子都变腐烂,而这个腐烂橘子刚开始在的时间是 −1 ,那么按照广度优先搜索的算法,下一分钟也就是第 0 分钟的时候,这个腐烂橘子会把它们都变成腐烂橘子,然后继续向外拓展,所以其实这些腐烂橘子是同一层的节点。那么在广度优先搜索的时候,我们将这些腐烂橘子都放进队列里进行广度优先搜索即可,最后每个新鲜橘子被腐烂的最短时间 dis[x][y] 其实是以这个超级源点的腐烂橘子为起点的广度优先搜索得到的结果。

    为了确认是否所有新鲜橘子都被腐烂,可以记录一个变量 cnt 表示当前网格中的新鲜橘子数,广度优先搜索的时候如果有新鲜橘子被腐烂,则 cnt-=1 ,最后搜索结束时如果 cnt 大于 0 ,说明有新鲜橘子没被腐烂,返回 −1 ,否则返回所有新鲜橘子被腐烂的时间的最大值即可,也可以在广度优先搜索的过程中把已腐烂的新鲜橘子的值由 1 改为 2,最后看网格中是否由值为 1 即新鲜的橘子即可。

    1. class Solution {
    2. int cnt;
    3. int dis[10][10];
    4. int dir_x[4]={0, 1, 0, -1};
    5. int dir_y[4]={1, 0, -1, 0};
    6. public:
    7. int orangesRotting(vector<vector<int>>& grid) {
    8. queue<pair<int,int> >Q;
    9. memset(dis, -1, sizeof(dis));
    10. cnt = 0;
    11. int n=(int)grid.size(), m=(int)grid[0].size(), ans = 0;
    12. for (int i = 0; i < n; ++i){
    13. for (int j = 0; j < m; ++j){
    14. if (grid[i][j] == 2){
    15. Q.push(make_pair(i, j));
    16. dis[i][j] = 0;
    17. }
    18. else if (grid[i][j] == 1) cnt += 1;
    19. }
    20. }
    21. while (!Q.empty()){
    22. pair<int,int> x = Q.front();Q.pop();
    23. for (int i = 0; i < 4; ++i){
    24. int tx = x.first + dir_x[i];
    25. int ty = x.second + dir_y[i];
    26. if (tx < 0|| tx >= n || ty < 0|| ty >= m|| ~dis[tx][ty] || !grid[tx][ty]) continue;
    27. dis[tx][ty] = dis[x.first][x.second] + 1;
    28. Q.push(make_pair(tx, ty));
    29. if (grid[tx][ty] == 1){
    30. cnt -= 1;
    31. ans = dis[tx][ty];
    32. if (!cnt) break;
    33. }
    34. }
    35. }
    36. return cnt ? -1 : ans;
    37. }
    38. };

    复杂度分析

    时间复杂度:O(nm)
    即进行一次广度优先搜索的时间,其中n=grid.length, m=grid[0].length 。

    空间复杂度:O(nm)
    需要额外的 dis 数组记录每个新鲜橘子被腐烂的最短时间,大小为 O(nm),且广度优先搜索中队列里存放的状态最多不会超过nm 个,最多需要 O(nm) 的空间,所以最后的空间复杂度为 O(nm)。

  • 相关阅读:
    经典算法——顺序查找
    【Selenium2+python】自动化unittest生成测试报告
    Java通过自定义类加载器模拟冰蝎免杀功能
    【MATLAB】史上最全的9种频谱分析算法全家桶
    JavaWeb课程复习资料——idea创建JDBC
    Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业
    马斯克公开支持上班“摸鱼”,允许员工坐班听音乐,还可外放
    【操作系统笔记十四】科普:POSIX 是什么
    elementplus $confirm $message消息弹框
    企业数据资产管理的参考框架和方法
  • 原文地址:https://blog.csdn.net/m0_63309778/article/details/126753608
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号