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

【leetcode hot 100 73】矩阵置零

解法一:(使用两个标记变量)用矩阵的第一行和第一列代替方法一中的两个标记数组(col、row[ ]:第几列、行出现0),以达到 O(1) 的额外空间。

  • 这样会导致原数组的第一行和第一列被修改,无法记录它们是否原本包含 0。因此我们需要额外使用两个标记变量分别记录第一行和第一列是否原本包含 0。
  • 在实际代码中,我们首先预处理出两个标记变量,接着使用其他行与列去处理第一行与第一列,然后反过来使用第一行与第一列去更新其他行与列,最后使用两个标记变量更新第一行与第一列即可。
class Solution {
    public void setZeroes(int[][] matrix) {
        int m=matrix.length, n=matrix[0].length;
        boolean row=false, col=false;

        // 判断第一行有没有0
        for(int i=0; i<n; i++){
            if(matrix[0][i]==0){
                row=true;
            }
        }

        // 判断第一列有没有0
        for(int i=0; i<m; i++){
            if(matrix[i][0]==0){
                col=true;
            }
        }

        // 判断数组中是否有0 -> ij都是从1开始
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if(matrix[i][j]==0){
                    matrix[0][j]=0;
                    matrix[i][0]=0;
                }
            }
        }

        // 第一行出现0的列+第一列出现0的行=0 -> ij都是从1开始
        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][0]==0或者matrix[0][j]==0,则matrix[i][j]==0
                    matrix[i][j]=0; 
                }
            }
        }

        // 判断第一行第一列是否需要置零
        if(row){
            for(int i=0;i<n;i++){
                matrix[0][i]=0;
            }
        }
        if(col){
            for(int i=0;i<m;i++){
                matrix[i][0]=0;
            }
        }
    }
}

注意:

  • 同时涉及到ij时,ij都是从1开始 -> 只处理除了第一行和第一列的数
http://www.dtcms.com/a/51867.html

相关文章:

  • 软件高级架构师 - 软件工程
  • VS2022安装Framework 4.0和.NET Framework 4.5
  • Android车机DIY开发之软件篇(二十)立创泰山派android编译
  • C语言100天练习题【记录本】
  • C++ Boost库中Chrono时间模块的基本使用
  • GB28181开发--ZLMediaKit‌+WVP+Jessibuca‌
  • JAVA入门——反射
  • Sass 模块化革命:深入解析 @use 语法,打造高效 CSS 架构
  • 解锁访问者模式:Java编程的灵活之道
  • 神旗视讯Linux client 3.4版本发布和开源
  • 每日学习Java之一万个为什么?(Maven篇+RPC起步+CICD起步)(待完善)
  • [内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希
  • 从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(1)视频信息的获取与转发
  • AR配置静态IP双链路负载分担示例
  • 说一下SpringBoot3新特新和JDK17新特性
  • 去除HTML有序列表(ol)编号的多种解决方案
  • 分布式存储学习——HBase概述
  • 华为hcie证书有什么作用?
  • 【MYSQL数据库异常处理】执行SQL语句报超时异常
  • 深度学习实战:用TensorFlow构建高效CNN的完整指南
  • 在 Apache Tomcat 中,部署和删除项目
  • 5年前问题的答案,如何造统计信息
  • Claude 3.7登顶webdev榜首,国内怎么使用Claude 3.7
  • 【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践
  • 深入MiniQMT:实现远程下单的高效解决方案
  • 14、TCP连接如何确保可靠性【高频】
  • 多线程-定时任务线程池源码
  • navicat导出postgresql的数据库结构、字段名、备注等等
  • kubectl 运行脚本 kubernetes 部署springcloud微服务 yaml + Dockerfile+shell 脚本
  • 大模型巅峰对决:DeepSeek vs GPT-4/Claude/PaLM-2 全面对比与核心差异揭秘