当前位置: 首页 > article >正文

hot100_73. 矩阵置零

hot100_73. 矩阵置零

  • 方法一:使用标记数组
  • 方法二:使用两个标记变量

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

方法一:使用标记数组

思路和算法

我们可以用两个标记数组分别记录每一行和每一列是否有零出现。

具体地,我们首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组,用标记数组更新原数组即可。

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length,n=matrix[0].length;
        boolean[] row = new boolean[m];
        boolean[] col = new boolean[n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]==0){
                    row[i]=col[j]=true;
                }
            }
        }

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

方法二:使用两个标记变量

思路和算法

我们可以用矩阵的第一行和第一列代替方法一中的两个标记数组,以达到 O(1) 的额外空间。但这样会导致原数组的第一行和第一列被修改,无法记录它们是否原本包含 0。因此我们需要额外使用两个标记变量分别记录第一行和第一列是否原本包含 0。

在实际代码中,我们首先预处理出两个标记变量,接着使用其他行与列去处理第一行与第一列,然后反过来使用第一行与第一列去更新其他行与列,最后使用两个标记变量更新第一行与第一列即可。

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length,n=matrix[0].length;
        boolean flagCol0 = false, flagRow0 = false;
        for(int i=0;i<m;i++){
            if(matrix[i][0]==0){
                flagCol0 = true;
            }
        }
        for(int j=0;j<n;j++){
            if(matrix[0][j]==0){
                flagRow0 = true;
            }
        }

        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if(matrix[i][j]==0){
                    matrix[i][0]=matrix[0][j]=0;
                }
            }
        }

        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if(matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }

        if(flagCol0){
            for(int i=0;i<m;i++){
                matrix[i][0]=0;
            }
        }
        if(flagRow0){
            for(int j=0;j<n;j++){
                matrix[0][j]=0;
            }
        }

    }
}

http://www.kler.cn/a/469856.html

相关文章:

  • 阿尔法linux开发板ping不通百度
  • HTML+CSS+JS制作中华传统文化主题网站(内附源码,含5个页面)
  • VTK 鼠标+键盘重构
  • Harmony开发【笔记1】报错解决(字段名写错了。。)
  • 网络层协议之IP数据包层分片随笔
  • 78、使用爱芯派2_AX630C开发板 3.2T高有效算力 低功耗 支持AI-ISP真黑光实验
  • GitLab 创建项目、删除项目
  • 系统编程1.0-exec函数和exit()的使用
  • 《OpenCV 5.0.0-alpha:开启计算机视觉新篇章》
  • 在arm平台Euler系统上编译安装ffmpeg
  • [python]验证码识别库-DDDDOCR
  • CAM几何引擎简介
  • 目标检测算法-Picodet
  • 基于python大数据分析的高考志愿填报推荐系统实现
  • 决定系数(R²分数)——评估回归模型性能的一个指标
  • 【办公类-88-02】20250106批量读后感
  • Leetcode-234 回文链表
  • 飞牛fnOS如何通过docker安装宝塔面板
  • 基于Python深度学习【眼疾识别】系统设计与实现+人工智能+机器学习+TensorFlow算法
  • 1929-2024年全球气象站点逐日气象指标数据(气温、降水量、风速等12项)
  • 最新国家商标战略实施DID数据(2007-2023年)
  • 使用Locust对MongoDB进行负载测试
  • 力扣-数组-01两数之和
  • Mysql事务的特性和隔离级别
  • HTML5 + Bootstrap5 网站底部代码分享与解析
  • 【网络安全设备系列】13、网页防篡改