给定一个由 0 和 1 组成的矩阵,找出每个元...

这篇博客介绍了如何利用动态规划算法优化解决一个矩阵问题,即给定一个由0和1组成的矩阵,找到每个1到最近的0的最短路径。博主首先提出初始思路是使用bfs,但考虑到空间复杂度,选择了动态规划方法。通过两次遍历矩阵,实现了从左上到右下再到右下的更新过程,有效找到了距离最近的0的步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该题目首先我想到的算法是bfs,但是bfs的空间复杂度较高,需要额外的队列,在看完题解之后,发现了动态规划这个好办法。具体程序代码如下:

复制代码
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (matrix[i][j] == 1) {
                    matrix[i][j] = INT_MAX / 2;
                }
            }
        }

        for (int i = 0; i < m; ++i) {
          

这个问题可以通过广度优先搜索(BFS)算法来解决。首先,我们需要找出矩阵中所有值为1素的位置,然后从这些位置开始,对矩阵中的每个素进行广度优先搜索。在搜索过程中,我们需要记录每个素到最近的1的距离。以下是一个可能的算法步骤: 1. 遍历矩阵找出所有值为1素的位置。 2. 将所有值为1素的位置加入到一个队列中。 3. 初始化一个同样大小的矩阵,用于记录每个素到最近1的距离,初始值设为一个足够大的数(如矩阵大小的最大值)。 4. 从队列中取出位置,将其周围的素(如果是0,则将其值更新为当前位置的距离加1)加入队列,并更新这些素的距离。 5. 重复步骤4,直到队列为空。 6. 队列为空时,我们得到的矩阵就是每个素到最近1的距离矩阵。 下面是这个算法的伪代码实现: ```python def update_matrix(mat): rows, cols = len(mat), len(mat) dist = [[float('inf')] * cols for _ in range(rows)] queue = [] # 初始化队列距离矩阵 for r in range(rows): for c in range(cols): if mat[r][c] == 1: queue.append((r, c)) dist[r][c] = 0 # 四个方向的移动:上、下、左、右 directions = [(1, 0), (-1, 0), (0, 1), (0, -1)] # 广度优先搜索 while queue: r, c = queue.pop(0) for dr, dc in directions: nr, nc = r + dr, c + dc # 检查新位置是否在矩阵内,并且是否可以更新距离 if 0 <= nr < rows and 0 <= nc < cols and dist[nr][nc] > dist[r][c] + 1: dist[nr][nc] = dist[r][c] + 1 queue.append((nr, nc)) return dist # 示例 mat = [ [0, 0, 0], [0, 1, 0], [0, 0, 0] ] print(update_matrix(mat)) ``` 这段代码会返回一个新的矩阵,其中每个素表示原矩阵对应位置到最近的1的距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值