• 图解LeetCode——面试题 01.08. 零矩阵(难度:中等)


    一、题目

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

    二、示例

    2.1> 示例1

    【输入】
    [[1,1,1],
    [1,0,1],
    [1,1,1]]
    【输出】
    [[1,0,1],
    [0,0,0],
    [1,0,1]]

    2.2> 示例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]]

    三、解题思路

    根据题目描述,给我们一个矩阵M * N,需要将某个元素为0的行和列都清零,那么,我们首先创建两个数组:

    int[] rowsOfZero:用于存储元素值等于0的集合,数组长度为M,默认元素值都是0
    int[] columnsOfZero:用于存储元素值等于0的集合,数组长度为N,默认元素值都是0

    然后,我们就遍历入参matrix矩阵,找到元素值等于0的元素,然后将其行号&列号对应到上面的两个数组,并将其修改为1。我们以下图为例,遍历下图中的矩阵,我们找到了[0, 0][0, 3]这两个元素的值等于0,那么这两个元素对应的行号都是:0,对应的列号分别是:0和3。那么,映射到上面提到的两个数组,就变成了:rowsOfZero=[1, 0, 0] 和 columnsOfZero=[1, 0, 0, 1]。具体如下图所示:

    确定好了rowsOfZerocolumnsOfZero之后,我们再去遍历这两个数组,只要发现rowsOfZero[i] == 1 或者colunmsOfZero[j] == 1,那么我们就可以将元素[i, j]赋值为0。具体操作如下图所示:

    下面的两种实现方式,其实主要就在于采用哪种数据结构去存储行等于0的集合rowsOfZero)以及列等于0的集合columnsOfZero)。具体请见如下两种代码实现。

    四、代码实现

    4.1> 实现1:采用数组结构

    1. class Solution {
    2.     public void setZeroes(int[][] matrix) {
    3.         int[] rowsOfZero = new int[matrix.length], colunmsOfZero = new int[matrix[0].length];
    4.         for (int i = 0; i < matrix.length; i++
    5.             for (int j = 0; j < matrix[i].length; j++
    6.                 if (matrix[i][j] == 0) rowsOfZero[i] = colunmsOfZero[j] = 1;
    7.         for (int i = 0; i < rowsOfZero.length; i++
    8.             for (int j = 0; j < colunmsOfZero.length; j++
    9.                 if (rowsOfZero[i] == 1 || colunmsOfZero[j] == 1) matrix[i][j] = 0;
    10.     }
    11. }

    4.2> 实现2:采用Set结构

    1. class Solution {
    2.     public void setZeroes(int[][] matrix) {
    3.         Set<Integer> rowsOfZero = new HashSet(), colunmsOfZero = new HashSet();
    4.         for (int i = 0; i < matrix.length; i++) {
    5.             for (int j = 0; j < matrix[i].length; j++) {
    6.                 if (matrix[i][j] == 0) {
    7.                     rowsOfZero.add(i);
    8.                     colunmsOfZero.add(j);
    9.                 }
    10.             }
    11.         }
    12.         for (Integer row : rowsOfZero) {
    13.             for (int i = 0; i < matrix[row].length; i++) {
    14.                 matrix[row][i] = 0;
    15.             }
    16.         }
    17.         for (Integer colunm : colunmsOfZero) {
    18.             for (int i = 0; i < matrix.length; i++) {
    19.                 matrix[i][colunm] = 0;
    20.             }
    21.         }
    22.     }
    23. }

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

  • 相关阅读:
    牛客暑期多校解题报告: 2
    CTFHub-SSRF-读取伪协议
    JavaSE | 初始Java(十一) | 抽象类和抽象接口
    ArcGIS API for JavaScript实现要素服务query接口的功能
    Flink如何基于事件时间消费分区数比算子并行度大的kafka主题
    FreeRTOS创建任务-简要
    java Spring Boot 将日志写入文件中记录
    python爬虫6
    基础设施SIG月度动态:「龙蜥大讲堂」基础设施系列专题分享完美收官,容器镜像构建 2.0 版本上线
    小程序如何设置自取规则
  • 原文地址:https://blog.csdn.net/qq_26470817/article/details/127116678