当前位置: 首页 > news >正文

[算法题]01 矩阵

题目链接: 01 矩阵

多源BFS类型题, 即给定多个起点, 判断从哪个起点走到终点距离最短, 一般解题思路为将所有起点看成一个"起点", 由此"起点"做bfs得到题解, 实际代码编写将所有起点都入队列, 每次都对所有起点做一层扩展.

题解思路:

从1往0处走寻找最短距离不好操作, 逆向思维从0往1处走, 这样很好更新最短距离, 如图:

第一层的值为0, 那么扩展后的值就是0+1

第二层的值为1, 那么扩展后的值就是1+1

题解大致步骤:

1. 定义方向数组.

2. 定义一个与mat同等规模的二维数组, 将其初始值设为-1, 当数组对应坐标的值为-1时表示当前位置未被访问过, 当数组对应坐标的值不为-1时则表示该坐标到0的最短距离.

3. 定义一个存储pair<int,int>的队列, 并将mat数组中0的坐标入队, 同时将步骤2定义的数组的同等坐标位置的值置为0.

4. 做一次多源bfs, 每次取队头的值向四周扩一次, 并根据条件更新队列和步骤2的数组, 最后步骤2的数组就是题解, 返回即可.

题解代码:

class Solution 
{
public:vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {//方向数组int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};int row = mat.size();int col = mat[0].size();vector<vector<int>> res(row, vector<int>(col, -1));queue<pair<int,int>> q;//添加0的坐标到qfor(int i = 0; i < row; ++i){for(int j = 0; j < col; ++j){if(mat[i][j] == 0){q.push({i, j});res[i][j] = 0; //同时修改结果数组}}}//多源bfswhile(q.size()){auto [a, b] = q.front();q.pop();for(int j = 0; j < 4; ++j){int x = a + dx[j];int y = b + dy[j];if(x >= 0 && x < row && y >= 0 && y < col && res[x][y] == -1){q.push({x, y});res[x][y] = res[a][b] + 1;}}}return res;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MybatisPlus使用指南
  • git上传本地代码到新建分支
  • 00067期 matlab中的asv文件
  • Vue 3 中的观察者效果:从 watch 到 watchEffect、watchSyncEffect 和 watchPostEffect
  • 超全面!Midjourney用户手册中文版!详解模型、命令、参数与高级用法
  • MySQL 数据库经验总结
  • HttpUtils工具类(一)常见的HttpUtils工具类及如何自定义java的http连接池
  • 【机器学习】CNN的基本架构模块
  • 观察者模式和MQ是什么关系
  • Python利用openpyxl复制Excel文件且保留样式—另存为副本(附完整代码)
  • 零售业务产品系统应用架构设计(二)
  • 一伴app相亲交友源码开发
  • 新手常见错误:java.lang.NumberFormatException: For input string: “xxxx“
  • GD32 MCU内部温度传感器如何使用,以及适合哪种应用场景?
  • BQ27441初始化配置程序,电压、SOC等参数读取程序
  • 【译】JS基础算法脚本:字符串结尾
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • CSS实用技巧
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript创建对象的四种方式
  • JAVA多线程机制解析-volatilesynchronized
  • java中具有继承关系的类及其对象初始化顺序
  • SQLServer之创建显式事务
  • Vue学习第二天
  • 初探 Vue 生命周期和钩子函数
  • 大快搜索数据爬虫技术实例安装教学篇
  • 和 || 运算
  • 目录与文件属性:编写ls
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 学习笔记TF060:图像语音结合,看图说话
  • 智能合约Solidity教程-事件和日志(一)
  • 转载:[译] 内容加速黑科技趣谈
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #在 README.md 中生成项目目录结构
  • $nextTick的使用场景介绍
  • %check_box% in rails :coditions={:has_many , :through}
  • (12)Hive调优——count distinct去重优化
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (C语言)fgets与fputs函数详解
  • (九)信息融合方式简介
  • (六)Flink 窗口计算
  • (四)汇编语言——简单程序
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)Neo4j下载安装以及初次使用
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转载)虚函数剖析
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***原理与防范
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .md即markdown文件的基本常用编写语法
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .net6使用Sejil可视化日志
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思