leetcode最短路径专题

542.01矩阵

在这里插入图片描述

思路

在这里插入图片描述

复杂度

时间复杂度: O ( r c ) O(rc) O(rc),其中 r 为矩阵行数,c 为矩阵列数,即矩阵元素个数。广度优先搜索中每个位置最多只会被加入队列一次,因此只需要 O ( r c ) O(rc) O(rc) 的时间复杂度。

空间复杂度: O ( r c ) O(rc) O(rc),其中 r 为矩阵行数,c 为矩阵列数,即矩阵元素个数。除答案数组外,最坏情况下矩阵里所有元素都为 0,全部被加入队列中,此时需要 O ( r c ) O(rc) O(rc) 的空间复杂度。

超级源点最短路径

cpp

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>>& matrix) {
		int m = matrix.size(), n = matrix[0].size();
		vector<vector<int>> dist(m, vector<int>(n));//距离矩阵
		vector<vector<int>> seen(m, vector<int>(n));//访问矩阵
		queue<pair<int, int>> q;
		// 将所有的 0 添加进初始队列中
		for (int i = 0; i < m; ++i) {
			for (int j = 0; j < n; ++j) {
				if (matrix[i][j] == 0) {
					q.emplace(i, j);
					seen[i][j] = 1;
				}
			}
		}
		// 广度优先搜索bfs
		while (!q.empty()) {
			auto top = q.front();
			int i = top.first;//行下标
			int j = top.second;//列下标
			q.pop();
			for (int d = 0; d < 4; ++d) {
				int ni = i + dirs[d][0];
				int nj = j + dirs[d][1];
				if (ni >= 0 && ni < m && nj >= 0 && nj < n && !seen[ni][nj]) {
					dist[ni][nj] = dist[i][j] + 1;
					q.emplace(ni, nj);//入队
					seen[ni][nj] = 1;
				}
			}
		}
		return dist;
	}
};

python3

from collections import deque
class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        r, c = len(matrix), len(matrix[0])  # 行列数
        seen = [[False]*c for _ in range(r)]
        dist = [[0] * c for _ in range(r)]
        q = deque()
        # 位置为0的入队,且访问矩阵对应值为true
        for i in range(r):
            for j in range(c):
                if not matrix[i][j]:
                    q.append((i, j))
                    seen[i][j] = True

        while q:
            i, j = q.popleft()
            for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
                if 0 <= ni < r and 0 <= nj < c and not seen[ni][nj]:
                    dist[ni][nj] = dist[i][j] + 1
                    q.append((ni, nj))
                    seen[ni][nj] = True
        return dist

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值