LeetCode 面试题 01.08. 零矩阵

文章目录

一、题目

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

点击此处跳转题目

示例 1:

输入:

\[1,1,1\], \[1,0,1\], \[1,1,1

]

输出:

\[1,0,1\], \[0,0,0\], \[1,0,1

]

示例 2:

输入:

\[0,1,2,0\], \[3,4,5,2\], \[1,3,1,5

]

输出:

\[0,0,0,0\], \[0,4,5,0\], \[0,3,1,0

]

二、C# 题解

此题有很多方法解,无外乎都是记录需要清零的行与列,这种写法太无聊了。这里提出一种递归的方式,只需要遍历矩阵一次即可。当遇到 0 时,使用 set0 变量记录该位置,遍历完成后,重置所有 set0

csharp 复制代码
public class Solution {
    public void SetZeroes(int[][] matrix) {
        BFS(ref matrix, 0, 0); // 广度优先遍历
    }

    public void BFS(ref int[][] matrix, int i, int j) {
        int m = matrix.Length, n = matrix[0].Length;

        if (i == m && j == 0) return; // 递归出口

        // 计算下一个位置
        int next_i = i, next_j = j + 1;
        if (next_j == n) {
            next_j = 0;
            next_i++;
        }

        bool set0 = matrix[i][j] == 0;   // 记录当前状态,是否需要清零

        BFS(ref matrix, next_i, next_j); // 继续遍历

        // 最后执行清零
        if (set0) {
            for (int p = 0; p < n; p++) matrix[i][p] = 0;
            for (int q = 0; q < m; q++) matrix[q][j] = 0;
        }
    }
}
  • 时间复杂度: O ( m × n ) O(m\times n) O(m×n)。
  • 空间复杂度:由矩阵中 0 出现的次数决定。

该方法依据元素记录,因此当矩阵中 0 出现次数过多时,会有重复操作,只适合处理稀疏 0 矩阵。

矩阵中 0 过于密集时,使用记录行列的方式会更好些,但可能需要更多的空间和遍历次数。

相关推荐
吃好睡好便好7 小时前
提取矩阵特定多行元素
开发语言·线性代数·算法·matlab·矩阵
葫三生7 小时前
多模态视角下的一部当代东方创世史诗 ——《论三生原理》?(扩版)
人工智能·科技·算法·机器学习·开源
stsdddd7 小时前
【YOLO算法包裹背包行李箱塑料袋包装纸盒快递盒带目标检测数据集】
算法·yolo·目标检测
洛水水7 小时前
【力扣100题】52.最小路径和
算法·leetcode
快手技术7 小时前
将DSA注意力引入多模态,快手Keye2.0开启强化推理新范式
算法
圣保罗的大教堂8 小时前
leetcode 3043. 最长公共前缀的长度 中等
leetcode
码之气三段.8 小时前
牛客周赛 Round 145-E(写了200行的史山)
算法·深度优先
Hwang2528 小时前
Attention-04-decoder部分
算法
计算机安禾8 小时前
【算法分析与设计】第13篇:最小生成树:Prim算法与Kruskal算法的比较研究
大数据·人工智能·算法
weixin_428005308 小时前
.vdproj项目加载提示不兼容问题处理
c#·visual studio·.vdproj·.vdproj不兼容