【力扣算法题】矩阵
题目介绍
题号542
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/01-matrix
题解
1. 广度优先(个人解法/力扣官方解法1)
这题是个可以常常套用的模板,我个人更愿意称之它为“矩阵最短路径”问题,其实就是矩阵里面非0元素到0元素的最短距离。
我一开始确确实实想到了广度优先的办法来解决,但是我的广度优先比较暴力,也就是对于每个点都进行一次广度优先,很明显,超时了哈哈
仔细一想确实这样很有问题,一次广度优先本身就可以遍历访问所有节点,有没有办法利用这个特性来减少计算量呢?
其实最好的办法就是让所有0节点作为一个多叉树第一层的节点,之后进行广度优先就能把每一层的节点找到并给他们标记正确的距离,只是这样的多叉树没有根节点是不合法的,所以我们只利用广度优先的思想,假设我们有一个“抽象的根节点”,所有的0都连接着这个抽象的根节点,我们再进行广度优先
C++源码:
class Solution {
private:
static constexpr int dirs[4][2] = {
{
-1, 0}, {
1, 0}, {
0, -1}, {
0, 1}};
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
unsigned int rl = mat.size();
unsigned int cl = mat[0].size();
queue<pair<int, int>> q;
vector<vector<int>>