【两次过】Lintcode 162. 矩阵归零

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/86521263

给定一个m×n矩阵,如果一个元素是0,则将其所在行和列全部元素变成0。

需要在原矩阵上完成操作。

样例

给出一个矩阵

[
  [1, 2],
  [0, 3]
]

返回

[
  [0, 2],
  [0, 0]
]

挑战

你是否使用了额外的空间?
一个直接的解决方案是使用 O(MN) 的额外空间,但这并不是一个好的方案。
一个简单的改进方案是使用 O(M + N) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?


解题思路:

先将矩阵中所有0的坐标存储起来,然后依次对0点坐标向四周遍历归零。

public class Solution {
    /**
     * @param matrix: A lsit of lists of integers
     * @return: nothing
     */
    public void setZeroes(int[][] matrix) {
        // write your code here
        List<List<Integer>> zero = new ArrayList<>();
        
        //将矩阵中所有的零点记录保存到zero中
        for(int row=0; row<matrix.length; row++){
            for(int col=0; col<matrix[0].length; col++){
                if(matrix[row][col] == 0){
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(row);
                    list.add(col);
                    
                    zero.add(list);
                }
            }
        }
        
        //将矩阵所有为0的点四周依次归零
        for(int i=0; i<zero.size(); i++){
            int row = zero.get(i).get(0);
            int col = zero.get(i).get(1);
            convertZero(matrix, row, col);
        }
    }
    
    //将[row, col]所在行列全部变为0
    private void convertZero(int[][] matrix, int row, int col){
        for(int i=0; i<matrix.length; i++)
            matrix[i][col] = 0;
        
        for(int i=0; i<matrix[0].length; i++)
            matrix[row][i] = 0;
        
    }
}

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/86521263
今日推荐