73. Set Matrix Zeroes

一、题目

  1、审题

  

  2、分析

    给出一个 mXn 二维矩阵,若 [i][j] 值为 0, 则矩阵第 i 行,第 j 列化为 0。

二、解答

  1、思路:

    方法一、

      矩阵行长为 m,列长为 n,新建两个大小为 m、n的一维数组,用于记录该行、列是否为 0,最终,遍历数组给矩阵赋值即可。

      使用额外空间 O(m+n)

public void setZeroes(int[][] matrix) {
    
        int m = matrix.length;
        int n = matrix[0].length;
        
        int[] rowArr = new int[m];
        int[] columnArr = new int[n];
        for (int i = 0; i < m; i++){ 
            for (int j = 0; j < n; j++) 
                if(matrix[i][j] == 0) {
                    rowArr[i] = 1;
                    columnArr[j] = 1;
                }
        }
        // 行化为 0
        for (int i = 0; i < m; i++) {
            if(rowArr[i] == 1) {
                for (int j = 0; j < n; j++) {
                    matrix[i][j] = 0; 
                }
            }
        }
        
        // 列化为 0
        for (int i = 0; i < n; i++) {
            if(columnArr[i] == 1) {
                for (int j = 0; j < m; j++) {
                    matrix[j][i] = 0; 
                }
            }
        }
    }

 

  方法二、

    将矩阵的第一行、第一列用作标记项;若 [i][j] 出现元素值为 0, 则 [i][0] 赋值 0,[0][j] 赋值为 0;

    由于遍历矩阵时,[0][0] 用于标记第一行是否为 0,故第一列是否为 0 需要另外申请一个变量 col0 记录;

    使用存储空间为 O(1)

public void setZeroes2(int[][] matrix) {
        
        int rows = matrix.length;
        int columns = matrix[0].length;
        int col0 = 1;
        
        for (int i = 0; i < rows; i++) {
            if(matrix[i][0] == 0)
                col0 = 0; // 标记第一列是否为 0
            // 第一行、第一列用于作标记
            for (int j = 1; j < columns; j++) {
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0; 
                }
                    
            }
        }
        
        
        for (int i = rows - 1; i >= 0; i--) {
            for(int j = columns - 1; j >= 1; j--)
                if(matrix[i][0] == 0 || matrix[0][j] == 0)
                    matrix[i][j] = 0;
            
            if(col0 == 0) matrix[i][0] = 0;
        }
    }

 

posted @ 2018-09-21 17:42  skillking2  阅读(144)  评论(0编辑  收藏  举报