73. 矩阵置零

小豆丁 1年前 ⋅ 1008 阅读
73. 矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

示例 1:

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

解析

比较麻烦的一道题,倒是不难。

1、首先我们先标记第一行和第一列是否含有0

2、然后我们进行双重for循环遍历矩阵,遇到0就把行头和列头都变成0

3、我们遍历行头和列头,遇到0就把当前行列都变为0

4、我们由第一步中的结果考虑是否把首行和首列变成0

class Solution {
    public void setZeroes(int[][] matrix) {boolean hang = false;
        for(int j = 0 ; j < matrix[0].length;j++){
            if(matrix[0][j]==0){
                hang = true;
                break;
            }
        }

        boolean lie = false;
        for(int i = 0 ; i < matrix.length;i++){
            if(matrix[i][0]==0){
                lie = true;
                break;
            }
        }

        for(int i = 0;i<matrix.length;i++){
            for(int j = 0;j<matrix[0].length;j++){
                if(matrix[i][j]==0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        for(int i = 1 ; i < matrix.length;i++){
            if(matrix[i][0]==0){
                for(int j = 1 ; j<matrix[0].length;j++){
                    matrix[i][j] = 0;
                }
            }
        }

        for(int j = 1 ; j < matrix[0].length;j++){
            if(matrix[0][j]==0){
                for(int i = 1;i<matrix.length;i++){
                    matrix[i][j] = 0;
                }
            }
        }
        if(hang){
            for(int j = 0 ; j<matrix[0].length;j++){
                matrix[0][j] = 0;
            }
        }
        if(lie){
            for(int i = 0 ; i < matrix.length;i++){
                matrix[i][0] = 0;
            }
        }
    }
}