Algorithms first
矩阵置零 · 交互式算法学习
若元素为 0,将其所在整行整列置零。
#73 · 矩阵
矩阵置零
Set Matrix Zeroes
matrix = [[1,1,1],[1,0,1],[1,1,1]]矩阵3 个关键状态
步骤 1中心 0 把行首与列首设为 0。
markers set10,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}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
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 同题参考实现。
AlgoViz Lab
矩阵置零 · 解法对比
若元素为 0,将其所在整行整列置零。
- 测试用例
matrix = [[1,1,1],[1,0,1],[1,1,1]]- 题目分类
- 矩阵
- 解法对比
- 2
记录零所在行列
第一遍收集含零的行列,第二遍统一置零。
- 时间
O(mn)- 空间
O(m+n)
首行首列作标记
用矩阵首行首列保存标记,额外变量记录首列是否清零。
- 时间
O(mn)- 空间
O(1)