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

相关推荐
小程故事多_801 天前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_956121971 天前
二分算法(知识点+题目)
c++·算法
AndrewHZ1 天前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场1 天前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
雪隐1 天前
WPF + MVVM 实战系列01-一个老狗回炉重造 WPF 的 12 天血泪史
sqlite·c#·mvvm
玖玥拾1 天前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI1 天前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
小程故事多_801 天前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
在世修行1 天前
从零打造 C# 工业视觉检测系统(四):海康威视 MVS SDK 入门与相机枚举实战
数码相机·c#·视觉检测