【算法-力扣】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;// 定义两个数组来标记该行列是否有0boolean[] row = new boolean[m];boolean[] col = new boolean[n];// 遍历二位数组,设置行列数值的值for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 为0则所在行列标记为trueif (matrix[i][j] == 0)row[i] = col[j] = true;}}// 第二次遍历,根据标记数组的结果来更新原数组for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 当前遍历元素所在行列标记为true,则当前元素为0if (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则所在行列标记为trueif (matrix[i][j] == 0) {matrix[i][0] = matrix[0][j] = 0;// 如果是第一行,则标记该行是否有0的标记为trueif (i == 0)rowZero = true;// 如果是第一列,则标记该列是否有0的标记为trueif (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)的空间复杂度,我们采用了这种优化手段。然而,这种做法却增加了代码的复杂度并降低了可读性。这证明了在编程和算法设计中,往往需要在各种因素之间做出权衡。没有完美的解决方案,关键在于如何根据实际需求做出恰当的选择与牺牲!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索

文章目录 引言机器学习与物流科技的基本概念机器学习概述监督学习无监督学习强化学习 物流科技概述路径优化车辆调度需求预测 机器学习与物流科技的融合应用实时物流数据分析数据预处理特征工程 路径优化与优化模型训练模型评估 车辆调度与优化深度学习应用 需求预测与优化强化…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

Flutter系列:关于ensureInitialized()

Flutter系列 关于ensureInitialized() - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28…

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点&#xff0c;使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一&#xff0c;是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …

C#.Net筑基-类型系统①基础

C#.Net的BCL提供了丰富的类型&#xff0c;最基础的是值类型、引用类型&#xff0c;而他们的共同&#xff08;隐私&#xff09;祖先是 System.Object&#xff08;万物之源&#xff09;&#xff0c;所以任何类型都可以转换为Object。 01、数据类型汇总 C#.NET 类型结构总结如下图…

项目采购管理

目录 1.概述 2.三个子过程 2.1.规划采购管理 2.2.实施采购 2.3.控制采购 2.4.归属过程组 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 需求识别和分析 3.2.2. 制定采购计划 3.2.3. 发布采购请求 3.2.4. 供应商评估与选择 3.2.5. 合同签订 3.2.6. 采购…

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…

YouTube583美元账户做到一千多万美元,125万粉的顶级交易员

油管125万粉丝的Ross Cameron,一位把583美元账户做到一千多万美元。他说他曾经也是像无头苍蝇一样交易,最终凄惨爆仓,也就是在爆仓之后,他终于开始沉下心来研究交易策略,终于终于,他有一天找到了交易模型,并用它执行至今。 Ross Cameron无疑是最成功的日内交易员之一,而…

The Google File System 论文阅读

2003年USENIX&#xff0c;出自谷歌&#xff0c;开启分布式大数据时代的三篇论文之一 总体设计 假设 硬件损坏是常态&#xff0c;而非意外。例如磁盘损坏&#xff0c;断电&#xff0c;断网。所以持续的监控&#xff0c;错误诊断&#xff0c;错误恢复要纳入系统设计之中文件很…

【文档智能 RAG】RAG增强之路-智能文档解析关键技术难点及PDF解析工具PDFlux

前言 在私域知识问答和企业知识工程领域&#xff0c;结合Retrieval-Augmented Generation&#xff08;RAG&#xff09;模型和大型语言模型&#xff08;LLM&#xff09;已成为主流方法。然而&#xff0c;企业中存在着大量的PDF文件&#xff0c;PDF解析的低准确性显著影响了基于…

open-amv开发环境搭建

open-amv是基于rv1103主控芯片的视觉开发板子 1.板子使用 板子使用type c作为调试口&#xff0c;同时供电&#xff0c;请在电脑上下载adb&#xff0c;当板子通过tpye c与电脑连接后&#xff0c;执行命令adb shell就会进入到板子的linux系统命令行。 2.编译环境 2.1 搭建doc…

ipad协议已更新

mmtls 24算法&#xff0c;by golang 其他/v1/other POST/v1/other/GetPeopleNearby 查看附近的人 POST/v1/other/GetQrCode 获取二维码 同步消息/v1/ws GET/v1/ws/GetSyncMsg 同步消息&#xff0c;ws协议 消息/v1/message POST/v1/message/AddMessageMgr 添加要发送…

什么是无杂散动态范围 (SFDR)?为什么 SFDR 很重要?

有多种不同的规格可用于表征电路线性度。SFDR 指标是一种常用的规范。该指标定义为所需信号幅度与感兴趣带宽内杂散的比率&#xff08;图 1&#xff09;。 图 1. 显示 SFDR 指标的图表。 对于 ADC&#xff0c;SFDR 展示了 ADC 如何在存在大信号的情况下同时处理小信号。作为一个…

如何阅读?从阅读中学阅读—《海绵阅读法》

大家好&#xff0c;我是老三&#xff0c;最近读了《海绵阅读法&#xff1a;如何吸收一本书的精华》&#xff0c;第一次阅读教如何阅读的书&#xff0c;整理一番读书笔记&#xff0c;分享给大家。 读书动机 我前一阵子写了篇文章&#xff0c;2024Q1&#xff0c;盘点我看过的54本…

[Java基本语法] 逻辑控制与方法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代&#xff0c;创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画&#xff0c;却又苦于找不到合适的画师或高昂的费用而望而却步&#xff1f;现在&#xff0c;这一切都将成为现实&#xff01; 进入首助编辑高手的AI魔法智绘图板块…

你能不能手敲出Spring框架?

Spring最成功的地方在于创始人Rod Johnson提出的IOC、AOP核心理念&#xff0c;反而不是其本身的技术。技术上今天可以有Spring春天&#xff0c;明天就可以有Autumn秋天。 核心理念有多重要&#xff1f;就如1871年巴黎公社的失败。公社在对抗法国zf和普鲁士占领军的背景下成立&…

英伟达开源 3400 亿巨兽:98% 合成数据训出最强开源通用模型,性能对标 GPT-4o

NVIDIA 最近开源了其大型语言模型 Nemotron-4 340B&#xff0c;这是一个具有划时代意义的模型&#xff0c;它使用了高达 98% 的合成数据进行训练&#xff0c;并且在性能上与 GPT-4 相当。Nemotron-4 340B 包括基础模型、指令模型和奖励模型&#xff0c;支持 4K 上下文窗口、50 …

回答网友的一个Delphi问题

网友想在grid 中 加一个水印&#xff0c;俺就给他写了个例子。先靠效果&#xff1a; 这个例子 包含下面几步&#xff1a; 1、创建背景 dg_bmp:Tbitmap.Create; w: Image1.Picture.Bitmap.width; h: Image1.Picture.Bitmap.height; dg_bmp.width: w*2; dg_bmp.height: …

从入门到高手的99个python案例(2)

51. 列表和数组比较 - 列表通用&#xff0c;NumPy数组高效。 import numpy as np normal_list [1, 2, 3] np_array np.array([1, 2, 3]) print(np_array.shape) # 输出 (3,), 数组有形状信息 52. Python的内置模块datetime - 处理日期和时间。 from datetime import…