73. 矩阵置零

矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

实例一:
image

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

实例二:
image

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

思路

  • 使用第 0 行和第 0 列来标记哪些行和列需要置为 0。
  • 在扫描矩阵时,通过第 0 行和第 0 列来标记相关的行和列。
  • 最后,根据这些标记置 0。
  • 为了不破坏原始矩阵的信息,遍历时从第 1 行和第 1 列开始,同时处理第 0 行和第 0 列时单独处理。
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean flagRow0 = false;
        boolean flagCol0 = false;
        //检查第0行是否有0
        for(int i = 0; i < n; i++){
            if(matrix[0][i] == 0){
                flagRow0 = true;
            }
        }
        //检查第0列是否有0
        for(int i = 0; i < m; i++){
            if(matrix[i][0] == 0){
                flagCol0 = true;
            }
        }

        //如果(i,j)处为0,将其所在的行和列的第一个元素标记为0
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }

        //根据前面的标记进行实际的置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;
                }
            }
        }

        //处理第0行
        for(int i = 0; i < n; i++){
            if(flagRow0){
                matrix[0][i] = 0;
            }
        }
        //处理第0列
        for(int i = 0; i < m; i++){
            if(flagCol0){
                matrix[i][0] = 0;
            }
        }
    }
}

[!NOTE]

  1. 第 0 行,第 0 列是用来做标记的,所以在进行标记处理的时候,是从 1 开始的。
  2. 问题解释:前面两个for循环以及两个布尔变量的作用是,用于处理第0行或者第0列本身就存在0的情况。
posted @ 2024-12-17 19:33  Drunker•L  阅读(6)  评论(0编辑  收藏  举报