Algorithms first

矩阵置零 · 交互式算法学习

若元素为 0,将其所在整行整列置零。

#73 · 矩阵

矩阵置零

Set Matrix Zeroes

测试用例matrix = [[1,1,1],[1,0,1],[1,1,1]]
矩阵3 个关键状态
步骤 1中心 0 把行首与列首设为 0。markers set
10,0
10,1
10,2
11,0
01,1
11,2
12,0
12,1
12,2
推荐

首行首列作标记

时间 O(mn)空间 O(1)

用矩阵首行首列保存标记,额外变量记录首列是否清零。

1function setZeroes(a) {2  let col0 = false;3  for (let r = 0; r < a.length; r++) {4    if (a[r][0] === 0) col0 = true;5    for (let c = 1; c < a[0].length; c++)6      if (a[r][c] === 0) a[r][0] = a[0][c] = 0;7  }8  for (let r = a.length - 1; r >= 0; r--) {9    for (let c = 1; c < a[0].length; c++)10      if (a[r][0] === 0 || a[0][c] === 0) a[r][c] = 0;11    if (col0) a[r][0] = 0;12  }13}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public void setZeroes(int[][] matrix) {3        int m = matrix.length, n = matrix[0].length;4        boolean[] row = new boolean[m];5        boolean[] col = new boolean[n];6        for (int i = 0; i < m; ++i) {7            for (int j = 0; j < n; ++j) {8                if (matrix[i][j] == 0) {9                    row[i] = col[j] = true;10                }11            }12        }13        for (int i = 0; i < m; ++i) {14            for (int j = 0; j < n; ++j) {15                if (row[i] || col[j]) {16                    matrix[i][j] = 0;17                }18            }19        }20    }21}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

矩阵置零 · 解法对比

若元素为 0,将其所在整行整列置零。

测试用例
matrix = [[1,1,1],[1,0,1],[1,1,1]]
题目分类
矩阵
解法对比
2
方案 1

记录零所在行列

第一遍收集含零的行列,第二遍统一置零。

时间
O(mn)
空间
O(m+n)
方案 2

首行首列作标记

用矩阵首行首列保存标记,额外变量记录首列是否清零。

时间
O(mn)
空间
O(1)