Typescript-Algorithms
    Preparing search index...

    Variable set_matrix_zeroesConst

    set_matrix_zeroes: (matrix: number[][]) => void = setZeroes

    73.矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请你原地使用常数空间解决这个问题。


    输入: matrix = [[1,1,1],[1,0,1],[1,1,1]]
    输出: [[1,0,1],[0,0,0],[1,0,1]]


    输入: 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]]


    • m == matrix.length
    • n == matrix[0].length
    • 1 <= m, n <= 200
    • -2^{31} <= matrix[i][j] <= 2^{31} - 1

    Type declaration

      • (matrix: number[][]): void
      • Do not return anything, modify matrix in-place instead.

        Parameters

        • matrix: number[][]

        Returns void

    1. 遍历矩阵,如果遇到 0,则将该行和该列的所有元素都置为 Infinity。
    2. 遍历矩阵,将所有 Infinity 置为 0。
    • 利用矩阵本身作为辅助空间,将需要置零的行和列标记为 Infinity,最后再遍历矩阵将 Infinity 置零。
    • 辅助空间解法:利用辅助空间记录需要置零的行和列,最后再遍历矩阵将需要置零的行和列置零。
    /**
    * Do not return anything, modify matrix in-place instead.
    */

    // 原地解法
    function setZeroes(matrix: number[][]): void {
    const m = matrix.length;
    const n = matrix[0].length;

    function reset(i: number, j: number) {
    for (let k = 0; k < n; k++) {
    if (matrix[i][k] !== 0) {
    matrix[i][k] = Infinity;
    }
    }

    for (let k = 0; k < m; k++) {
    if (matrix[k][j] !== 0) {
    matrix[k][j] = Infinity;
    }
    }
    }

    for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
    if (matrix[i][j] === 0) {
    reset(i, j);
    }
    }
    }

    for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
    if (matrix[i][j] === Infinity) {
    matrix[i][j] = 0;
    }
    }
    }
    };

    // 辅助空间解法
    function setZeroes1(matrix: number[][]): void {
    const rows = matrix.length;
    const cols = matrix[0].length;
    // 设置visited表示矩阵某个位置为0的访问情况,本身是0或者置0都加入visited
    const visited: boolean[][] = Array.from({ length: rows }, () => new Array(cols).fill(false));

    // reset表示将矩阵matrix中第row行col列的数字0所在的行和列所有数字置0
    function reset(matrix: number[][], row: number, col: number): void {
    // 定row,往左右跑
    // 定col,往上下跑
    visited[row][col] = true;

    for (let i = 0; i < cols; i++) {
    if (!visited[row][i] && matrix[row][i] !== 0) {
    visited[row][i] = true;
    matrix[row][i] = 0;
    }
    }

    for (let i = 0; i < rows; i++) {
    if (!visited[i][col] && matrix[i][col] !== 0) {
    visited[i][col] = true;
    matrix[i][col] = 0;
    }
    }
    }

    // 尝试每一个格子
    for (let i = 0; i < rows; i++) {
    for (let j = 0; j < cols; j++) {
    if (!visited[i][j] && matrix[i][j] === 0) {
    reset(matrix, i, j);
    }
    }
    }
    };