【算法-力扣】73.矩阵置零,一文彻底搞懂!

目录

一、题目描述

二、解题思路 

三、参考答案


一、题目描述

     矩阵置零

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

进阶:

  • 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

二、解题思路 

       我们可以创建两个布尔型标记数组,分别用来标记每一行和每一列中是否存在零元素。具体操作如下:首先遍历整个数组,当遇到元素值为0时,相应地将该元素所在的行和列在标记数组中的对应位置设为true。完成初步标记后,再次遍历原数组,利用之前设定的标记数组来更新原数组中的元素。这种方法能有效记录并处理零元素的位置。

三、参考答案

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        // 定义两个数组来标记该行列是否有0
        boolean[] row = new boolean[m];
        boolean[] col = new boolean[n];
        // 遍历二位数组,设置行列数值的值
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 为0则所在行列标记为true
                if (matrix[i][j] == 0)
                    row[i] = col[j] = true;
            }
        }
        // 第二次遍历,根据标记数组的结果来更新原数组
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 当前遍历元素所在行列标记为true,则当前元素为0
                if (row[i] || col[j])
                    matrix[i][j] = 0;
            }
        }
    }
}

        以上其实就是使用标记数组的方法来解决矩阵置零问题。通过创建两个数组,分别记录需要置零的行和列,然后再次遍历矩阵进行置零操作,我们可以实现对原矩阵的修改。这种方法的时间复杂度为O(mn),空间复杂度为O(m+n)。其中m是矩阵的行数,n是矩阵的列数。

       那么我们怎么能不借助额外空间,来达到空间复杂度为O(1)呢?

       我们可以使用矩阵的第一行和第一列来代替方法一中的两个标记数组,以达到O(1)的额外空间。

       但是如果第一行和第一列中就有0,该怎么办呢?

       

       就比如上图矩阵,当我们遍历到[0,2]位置的时候,也就是第一行有0的位置的时候。我们用第一行第一列标记的时候,那么此时我们的操作就是matrix[0][0]=matrix[0][2] = 0。因为matrix[0][0] = 0,那么当我们根据第一行和第一列的值来对原数组置零的时候,最终结果就如下:

        显然,这是不符合要求的。导致这个问题的原因就是第一行和第一列共用了matrix[0][0],当matrix[0][0]=0的时候,我们无法得知它是标记的行还是列,还是两者都进行了标记。所以,在置零原数组的时候,我们可以不置零第一行和第一列的元素。而是在第一次遍历进行标记的时候,另外使用两个变量来标记行列是否有0。如果有0,再单独进行行列的处理。

        那么此时的代码就如下:

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        // 定义两个变量来标记该行列是否有0,默认false,没有零
        boolean rowZero = false;
        boolean colZero = false;
        // 遍历二位数组,设置行列数值的值
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 为0则所在行列标记为true
                if (matrix[i][j] == 0) {
                    matrix[i][0] = matrix[0][j] = 0;
                    // 如果是第一行,则标记该行是否有0的标记为true
                    if (i == 0)
                        rowZero = true;
                    // 如果是第一列,则标记该列是否有0的标记为true
                    if (j == 0)
                        colZero = true;
                }
            }
        }
        // 第二次遍历,根据标记结果来更新原数组
        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;
            }
        }
        // 处理第一行和第一列
        for (int i = 0; colZero && i < m; i++)
            matrix[i][0] = 0;
        for (int j = 0; rowZero && j < n; j++)
            matrix[0][j] = 0;
    }
}

       为了达到O(1)的空间复杂度,我们采用了这种优化手段。然而,这种做法却增加了代码的复杂度并降低了可读性。这证明了在编程和算法设计中,往往需要在各种因素之间做出权衡。没有完美的解决方案,关键在于如何根据实际需求做出恰当的选择与牺牲!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711243.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

甄嬛传熹贵妃上户口:如果让他陪你过冬天,那朕能不能睡中间?贝叶斯模型推导爸爸去哪儿

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 背景 《甄嬛传》是大家耳熟能详的宫廷剧&#xff0c;其中复杂的宫斗情节和深刻的人物刻画让人津津乐道。甄嬛因为与皇帝(四郎)闹翻了&#xff0c;去甘露寺待了一段时间&#x…

0613,基本数据类型,表达式

题目1&#xff0c;选做&#xff1a; 假设 int n 0xCAFE; 请用表达式完成下面操作 (拓展题&#xff1a;不要求每个同学都写) (a) 测试最后 4 位中是不是最少有 3 位为 1. (b) 逆转字节序(i.e.,使 n 0xFECA) (c) 旋转 4 位 (i.e., 使 n 0xECAF) 答案代码/补&#xff1a; …

Elasticsearch 认证模拟题 - 18

一、题目 为一个索引&#xff0c;按要求设置以下 dynamic Mapping 一切 text 类型的字段&#xff0c;类型全部映射成 keyword一切以 int_ 开头命名的字段&#xff0c;类型都设置成 integer 1.1 考点 字段的动态映射 1.2 答案 # 创建索引和索引模板 PUT my_index {"m…

关于Linux ping 不通外网

网关为第三段为137那么子网ip第三段必须为137且IPaddr必须为137 将主机虚拟适配器连接到此网络必须勾上&#xff0c;不然vmnet适配器在windows将找不到 ping www.baidu.com不行的话试着勾上桥接模式应该是不行在勾上取消勾上桥接模式最后勾上nat模式

【Pr剪辑】工具栏的认识

目录 1.选择工具&#xff08;快捷键V&#xff09;1.1 选择1.2 移动素材1.3 框选1.4缩放1.5复制 2.钢笔工具&#xff08;快捷键P&#xff09;3.文字工具&#xff08;T&#xff09;4.剃刀&#xff08;C &#xff09;5.比例拉伸工具&#xff08;R&#xff09;6.波纹编辑工具&#…

从零开始开发知识付费APP:在线教育系统源码详解

今天&#xff0c;小编将从零开始&#xff0c;详细讲解在线教育系统的源码开发过程&#xff0c;帮助你打造一款功能完善的知识付费APP。 一、需求分析与规划 1.1 市场调研 在开始开发之前&#xff0c;首先要进行市场调研&#xff0c;了解当前市场上的主要竞争对手和用户需求。…

易保全网络赋强公证系统,“公证赋强+科技赋能”双重增信

网络赋强公证系统是一种创新的法律服务模式&#xff0c;旨在通过线上方式赋予债权文书强制执行效力。具体来说&#xff0c;该系统结合了互联网技术与公证业务&#xff0c;允许公证机构根据当事人的申请&#xff0c;利用互联网公证技术手段对互联网上的债权文书进行公证&#xf…

【SpringBoot系列】覆盖重写第三方Jar包中类

要覆盖或重写一个第三方JAR包中的类&#xff0c;你可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用类路径优先级 Java的类加载机制会优先加载类路径&#xff08;classpath&#xff09;中最先找到的类。因此&#xff0c;如果你在自己的项目中定义了一个与第三方JAR包…

ESP32-C6 闪耀 Apple WWDC24|使用 Embedded Swift 构建 Matter 设备

WWDC 是苹果公司的年度全球开发者大会&#xff0c;旨在向全球开发者展示最新技术和工具。在今年的 WWDC 2024 上&#xff0c;苹果宣布将 Swift 语言扩展至嵌入式设备领域。大会技术讲座中&#xff0c;乐鑫 ESP32-C6 也现身官方 Demo “Go Small with Embedded Swift​​​​​​…

【译】SQLAlchemy文档:SQLAlchemy 统一教程

SQLAlchemy Unified Tutorial SQLAlchemy 是 Python SQL工具包和ORM&#xff0c;它为应用程序开发人员提供了 SQL 的全部功能和灵活性。它提供了一整套企业级持久性模式&#xff0c;专为高效和高性能的数据库访问而设计。 SQLAlchemy呈现为两层API&#xff1a;Core和ORM&…

沃尔玛自养号测评:优势与技术要求解析

沃尔玛自养号测评是一种卖家在沃尔玛平台上提升店铺权重和排名的营销手段。传统运营策略的局限性日益显现&#xff0c;如营销手段单一、难以应对市场竞争等。因此&#xff0c;许多卖家为了提升店铺权重和排名&#xff0c;选择了自养号测评这一技术手段。 以下是对沃尔玛自养号…

使用CSS常见问题解答卡片

常见问题解答卡片 效果展示 CSS 知识点 CSS 选择器的使用background 渐变背景色运用CSS 综合知识运用 页面整体布局 <div class"container"><h1>经常问的问题</h1><!-- 这里只是展示一个项目 --><div class"tab"><in…

Apollo9.0 PNC源码学习之Control模块(三)—— 基于双环PID的纵向控制

本文将对Apollo的纵向控制器进行讲解&#xff0c;看完本文&#xff0c;你将会对百度Apollo的纵向控制有更深的理解 前面文章&#xff1a; Apollo9.0 PNC源码学习之Control模块&#xff08;一&#xff09; Apollo9.0 PNC源码学习之Control模块&#xff08;二&#xff09; 1 纵向…

如何用Vue3和p5.js打造一个令人惊叹的3D球体在线展示

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 p5.js 创建交互式 3D 图形 应用场景介绍 p5.js 是一个用于创建交互式图形和动画的 JavaScript 库。它被广泛用于教育、艺术和设计领域&#xff0c;让开发者可以轻松创建具有吸引力的可视化效果。 代码基…

高速公路智能管理系统:构建安全畅通的数字大动脉

随着城市化进程的加速和交通需求的增长&#xff0c;高速公路系统作为城市交通的重要组成部分&#xff0c;正承担着越来越多的交通运输任务。为了提升高速公路的安全性、便捷性和智能化管理水平&#xff0c;高速公路智能管理系统应运而生。本文将深入探讨高速公路智能管理系统的…

【FPGA】静态分析与时序约束(持续更新

Reference&#xff1a; V2静态时序分析与时序约束文档 入门 无时序约束场景中&#xff0c;普通图像显示不清晰&#xff0c;千兆网口接收Ethernet package 数据不正常&#xff0c;红外场景中图像显示不正常 Definition&#xff1a; 我们提出一些特定的时序要求&#xff08;或…

B端系统:面向用户or面向客户?有啥区别?当二者起冲突呢?

在B端系统中用户和客户大部分情况下是分离的&#xff0c;不像C端&#xff0c;用户即客户。那么用户和客户到底怎么区分&#xff0c;做B端设计到底听谁的呢&#xff1f;大美B端工场为大家详细解读下。 一、B端产品的用户和客户 在B端产品中&#xff0c;用户和客户是两个不同的…

JVM 垃圾回收器

一、垃圾回收器类型 如果说垃圾收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体 实现。下图展示了7种作用于不同分代的收集器&#xff0c;其中用于回收新生代的收集器 包括Serial、PraNew、Parallel Scavenge&#xff0c;回收老年代的收集器包括Seri…

计算机网络学习3

文章目录 以太网的MAC帧格式虚拟局域网VLAN概述虚拟局域网VLAN的实现机制以太网的发展802.11无线局域网的组成无线局域网的物理层无线局域网的数据链路层---使用CSMA/CD协议802.11无线局域网的MAC帧 网络层网络层概述网际协议IP和4.2.1异构网络互联IPv4地址及其编址方法概述IPv…

优思学院|用ChatGPT快速完成数据分析图表【柏累托图法】

数据分析是很多行业的人不可少的一部分&#xff0c;尤其是质量工程师更是日常的工作。然而&#xff0c;随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;将逐渐承担起数据计算的工作&#xff0c;这意味着未来的质量工程师需要具备的不仅仅是计算能力&#xff0c;…