LeetCode 73. 矩阵置零
题目描述
✅ 73. 矩阵置零
思路分析
解法一:首行首列标记(推荐)
核心思路:
- 用首行与首列充当标记数组,记录哪些行列需要置零。
- 先单独记录首行、首列是否需要置零。
- 再根据标记更新内部矩阵,最后处理首行首列。
复杂度分析:
- 时间复杂度:O(mn),其中 m、n 表示矩阵行列数。
- 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean firstRowZero = false;
boolean firstColZero = false;
// 判断首列是否需要置零
for (int i = 0; i < m; i++) {
if (matrix[i][0] == 0) {
firstColZero = true;
break;
}
}
// 判断首行是否需要置零
for (int j = 0; j < n; j++) {
if (matrix[0][j] == 0) {
firstRowZero = true;
break;
}
}
// 使用首行首列做标记
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
// 根据标记置零
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
// 处理首列
if (firstColZero) {
for (int i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
// 处理首行
if (firstRowZero) {
for (int j = 0; j < n; j++) {
matrix[0][j] = 0;
}
}
}
}
func setZeroes(matrix [][]int) {
m := len(matrix)
n := len(matrix[0])
firstRowZero := false
firstColZero := false
// 判断首列是否需要置零
for i := 0; i < m; i++ {
if matrix[i][0] == 0 {
firstColZero = true
break
}
}
// 判断首行是否需要置零
for j := 0; j < n; j++ {
if matrix[0][j] == 0 {
firstRowZero = true
break
}
}
// 使用首行首列做标记
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
if matrix[i][j] == 0 {
matrix[i][0] = 0
matrix[0][j] = 0
}
}
}
// 根据标记置零
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
if matrix[i][0] == 0 || matrix[0][j] == 0 {
matrix[i][j] = 0
}
}
}
// 处理首列
if firstColZero {
for i := 0; i < m; i++ {
matrix[i][0] = 0
}
}
// 处理首行
if firstRowZero {
for j := 0; j < n; j++ {
matrix[0][j] = 0
}
}
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 48. 旋转图像 | 中等 | 矩阵操作 |
| 54. 螺旋矩阵 | 中等 | 矩阵遍历 |
| 59. 螺旋矩阵 II | 中等 | 矩阵构造 |
| 74. 搜索二维矩阵 | 中等 | 二分查找 |
| 240. 搜索二维矩阵 II | 中等 | 二分查找 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!

