Leetcode 73.Set Matrix Zeroes

看起来很容易,但是按照正常的思路来解却有很多坑,    如果一个值==0, 那么它所在的那行和列全部设为0,  好像表面看起来直接根据这个逻辑写个for循环就AC了, 但是实际上要考虑一个问题就是会出现递归的情况, 就是设为0以后 这些变成0的值又执行了上述的这个逻辑,这就比较麻烦了。  但是 实际上出现这种情况的原因自己跑一遍逻辑就会发现是[i][0] [0][j]这些元素搞的鬼。 所以做赋值操作的时候从索引1开始。 

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean zeroCol = false;
        boolean zeroRow = false;
// 如果第一列有值为0 , 那么第一列全部要设成0, 但不是现在设, 否则会影响下面的 for循环判定
        for(int i = 0; i < matrix.length; i++) {
            if(matrix[i][0] == 0) {
                zeroCol = true;
                break;
            }
        }
// 同理     
        for(int j = 0; j < matrix[0].length; j++) {
            if(matrix[0][j] == 0) {
                zeroRow = true;
                break;
            }
        }
// 现在这个[i][0] [0][j]为0的原因避免了 第一列和第一行有值为0的干扰。        
        for(int i = 1; i < matrix.length; i++) {
            for(int j = 1; j < matrix[0].length; j++) {
                if(matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
// 避免了干扰之后 这个时候[i][0] [0][j] = 0的情况就可以放心大胆的给[i][j]赋0了
        for(int i = 1; i < matrix.length; i++) {
            for(int j = 1; j < matrix[0].length; j++) {
                if(matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        if(zeroRow == true) {
            for(int j = 0; j < matrix[0].length; j++) {
                matrix[0][j] = 0;
            }
        }
        
        if(zeroCol == true) {
            for(int i = 0; i < matrix.length; i++) {
                matrix[i][0] = 0;
            }
        }
        
        
        
    
    }
}

 

上一篇:Codeforce |Educational Codeforces Round 77 (Rated for Div. 2) B. Obtain Two Zeroes


下一篇:leetcode 73. Set Matrix Zeroes