刷题打卡——零矩阵

197 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

示例 1:

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

示例 2:

输入:
[
  [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,所以可以使用两个一位数组,分别记录行和列有0的下标,然后再判断如果行或者列有0.则把当前数置0。

三、AC 代码:

//第一种
class Solution {
    public void setZeroes(int[][] matrix) {
        int col = matrix[0].length;
        int row = matrix.length;
        int[][] temp = new int[row][col];
        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                temp[i][j] = matrix[i][j];
            }
        }

        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                if(temp[i][j]==0){
                    for(int k=0; k<col; k++){
                        matrix[i][k]=0;
                    }
                    for(int k=0; k<row; k++){
                        matrix[k][j]=0;
                    }
                }
            }
        }
    }
}
//第二种
class Solution {
    public void setZeroes(int[][] matrix) {
        int col = matrix[0].length;
        int row = matrix.length;
        boolean[] colArr = new boolean[col]; 
        boolean[] rowArr = new boolean[row]; 
        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                if(matrix[i][j]==0){
                    colArr[j]=true;
                    rowArr[i]=true;
                }
            }
        }

        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
               if(rowArr[i] || colArr[j]){
                   matrix[i][j] = 0;
               }
            }
        }
    }
}

总结

第二种方法明显比第一种要好很多,执行结果也从1ms变成了0ms,如果你有更好的方法请在评论区交流讨论哦。