算法小知识-----10.02----- 零矩阵

121 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

国庆第二天了,迎来了首道中等题,迎刃而解!!

零矩阵

该题出自力扣的面试01.08题 —— 零矩阵【中等题】

审题

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

image.png

  • 这道题题目很简单,只有一句话,就是给出一个二维数组的矩阵,并且给出规则,数组内存在0的,横排和竖排都需要清零
  • 需要注意的是,如果横排和竖排同时存在多个0,那么,并不会覆盖作用,被盖住的0依然会发挥自身的规则影响
  • 因此,需要统计每个位置对应的0的使用情况
    • 定义一个相同长度的二维数组,值为布尔值,初始值为false
    • 双重for循环遍历二维数组,如果当前下标等于0,并且下标对应的布尔值数组不为false的话,则证明未处理过,因此可以执行转换规则,调用相关的私有函数
    • 定义私有函数,作为二维数组的转换使用,两个for 循环,对应循环二维数组的行和列,设置对应下标的值为0,并且设置布尔数组的值为true
  • 使用一个标记变量记录第一列是否原本存在 0。这样,第一列的第一个元素即可以标记第一行是否出现 0。

编码

class Solution {
    public void setZeroes(int[][] matrix) {
        int n = matrix.length,m = matrix[0].length;
        b = new boolean[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (matrix[i][j] == 0 && !b[i][j]){
                    // 函数调用 + b 的 修改
                    match(matrix,i ,j);
                }
            }
        }
    }

    boolean[][] b;
    
    private void match(int[][] matrix,int i ,int j){
        for (int k = 0; k < matrix[0].length; k++) {
            if (matrix[i][k] != 0){
                matrix[i][k] = 0;
                b[i][k] = true;
            }
        }
        for (int k = 0; k < matrix.length; k++) {
            if (matrix[k][j] != 0){
                matrix[k][j] = 0;
                b[k][j] = true;
            }
        }
    }
}

image.png