矩阵置零

🔗 矩阵置零

题目来源:73. 矩阵置零 – 力扣(LeetCode)


📌 题目描述

给定一个 m x n 的矩阵 matrix,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用 原地算法(即直接修改原矩阵)完成。


✅ 示例解析

示例 1

  • 输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
  • 输出:[[1,0,1],[0,0,0],[1,0,1]]
  • 解释:中间的 0 导致第 1 行(索引 1)和第 1 列(索引 1)全部变为 0

示例 2

  • 输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
  • 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
  • 解释:第一行的 0 在第 0 列和第 3 列,因此第 0、3 列和第 0 行全部置零。

⚠️ 提示

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -2³¹ <= matrix[i][j] <= 2³¹ - 1

💡 解法:哈希表标记法 —— O(mn) 时间,O(m + n) 空间

class Solution {
    public void setZeroes(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return;
        }

        int m = matrix.length;
        int n = matrix[0].length;

        Set<Integer> rowsToZero = new HashSet<>();
        Set<Integer> colsToZero = new HashSet<>();

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    rowsToZero.add(i);
                    colsToZero.add(j);
                }
            }
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (rowsToZero.contains(i) || colsToZero.contains(j)) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

📊 复杂度分析

  • 时间复杂度:O(m × n)
    • 第一次双重循环遍历矩阵:O(mn)
    • 第二次双重循环置零:O(mn)
    • 总体为线性时间。
  • 空间复杂度:O(m + n)
    • 使用两个 HashSetrowsToZero 最多存储 m 个行号,colsToZero 最多存储 n 个列号。
    • 因此额外空间为 O(m + n)。

🧩 解题思路

  1. 核心思想:先记录,再置零
    • 不能边遍历边置零,否则会污染后续判断(把原本不是 0 的变成 0,导致错误扩散)。
    • 正确做法:先扫描一遍,记录哪些行和列需要置零,然后再统一处理。
  2. 两步走策略: 步骤 1:收集信息
    • 使用两个集合:
      • rowsToZero:存储所有包含 0 的行索引。
      • colsToZero:存储所有包含 0 的列索引。
    • 遍历整个矩阵,一旦发现 matrix[i][j] == 0,就将 i 加入行集合,j 加入列集合。
    步骤 2:执行置零
    • 再次遍历整个矩阵。
    • 对于每个位置 (i, j),如果 i 在 rowsToZero 中  j 在 colsToZero 中,则将其置为 0
  3. 为什么需要两个集合?
    • 因为一个 0 会影响一整行和一整列。
    • 我们需要记住所有“被污染”的行和列,不能只记一个。
  4. 举例说明
    matrix = [[1,1,1],[1,0,1],[1,1,1]]
    • Step 1: 发现 matrix[1][1] == 0 → rowsToZero = {1}colsToZero = {1}
    • Step 2: 遍历所有位置,凡是行号为 1 或列号为 1 的都置 0 → 第 1 行和第 1 列全变 0 ✅
  5. 边界处理
    • 空矩阵或空行:直接返回。
    • 没有 0:集合为空,不进行任何置零操作。
    • 全是 0:所有行和列都会被记录,最终整个矩阵仍为 0
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇