LeetCode 73. 矩阵置零

题目描述

73. 矩阵置零

image-20260329111315822

image-20260329111659642

思路分析

解法一:首行首列标记(推荐)

核心思路

  • 用首行与首列充当标记数组,记录哪些行列需要置零。
  • 先单独记录首行、首列是否需要置零。
  • 再根据标记更新内部矩阵,最后处理首行首列。


复杂度分析

  • 时间复杂度: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 中等 二分查找
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/73238111
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!