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 过于密集时,使用记录行列的方式会更好些,但可能需要更多的空间和遍历次数。

相关推荐
文丑颜不良啊1 分钟前
LeetCode2861~2880题目解析
java·leetcode
青少儿编程课堂26 分钟前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄1 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus11 小时前
C++关于分支预测的优化1
开发语言·c++·算法
用户7884773163417 小时前
WinForms 迁移 WPF:Upgrade Assistant 覆盖 30%,剩下 70% 我手写了六周
c#
Code_Solitude18 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司18 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
文丑颜不良啊19 小时前
LeetCode2821~2840题目解析
java·leetcode
YLCHUP21 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论