leetcode刷题记录(六十一)——73. 矩阵置零

ops/2025/1/17 16:15:14/

(一)问题描述

73. 矩阵置零 - 力扣(LeetCode)73. 矩阵置零 - 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 [http://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95] 算法。 示例 1:[https://assets.leetcode.com/uploads/2020/08/17/mat1.jpg]输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:[https://assets.leetcode.com/uploads/2020/08/17/mat2.jpg]输入:matrix = [[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 == matrix.length * n == matrix[0].length * 1 <= m, n <= 200 * -231 <= matrix[i][j] <= 231 - 1 进阶: * 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。 * 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。 * 你能想出一个仅使用常量空间的解决方案吗?icon-default.png?t=O83Ahttps://leetcode.cn/problems/set-matrix-zeroes/description/?envType=study-plan-v2&envId=top-100-liked        给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入:matrix = [[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 == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

进阶:

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

(二)解决思路

        显然这里要记录哪些行列需要被赋0值。题目要求采用原地算法,即采用固定数量的额外空间,那么就不能才有再开辟一个新的矩阵区域,将修改的元素放到新矩阵里的方式。一种可能的解决方式是维护一个标记矩阵,记录哪些位置需要被赋0值,此时额外空间是O(mn);另一种可能的解决方式是维护两个标记数组,分别记录哪一行、哪一列需要被赋0值,此时额外空间是O(m+n)。

        如果我们想使用常量空间来解决这个问题,可以把两个标记数组省略掉,直接用矩阵的第一行和第一列来标记哪行哪列需要赋0值:遍历矩阵,遇到了0值,就把该位置对应行和列的第一个元素都赋0值作为标记。

        但这样就分不清哪些0是原来第一行和第一列里就有的,哪些0是作为标记添加上去的了,因此需要在遍历之前,先维护两个标记变量mFlag和nFlag,用来记录第一行和第一列是否需要赋0值,初始为false:遍历第一行,如果第一行里有0元素,就把mFlag改为true,列和nFlag同理。遍历矩阵做好标记、含有标记的行列赋0值之后,再考察两个标记,如果标记为true就把第一行/第一列赋0值,否则不动。

java">class Solution {public void setZeroes(int[][] matrix) {boolean mFlag=false, nFlag=false;int m=matrix.length,n=matrix[0].length;//处理标记变量for(int i=0;i<m;i++){if(matrix[i][0]==0){mFlag=true;break;}}for(int i=0;i<n;i++){if(matrix[0][i]==0){nFlag=true;break;} }//根据第一行和第一列的标记对行列赋0值//例如,第一行中的第j位出现了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;}}}//根据第一行和第一列的标记,判断第一行和第一列是否需要赋0值if (mFlag) {for (int i = 0; i < m; i++) {matrix[i][0] = 0;}}if (nFlag) {for (int j = 0; j < n; j++) {matrix[0][j] = 0;}}} 
}

http://www.ppmy.cn/ops/150852.html

相关文章

【2024年华为OD机试】 (A卷,200分)- 最差产品奖(Java JS PythonC/C++)

一、问题描述 题目描述 A 公司准备对其下面的 N 个产品评选最差奖。评选的方式是首先对每个产品进行评分&#xff0c;然后根据评分区间计算相邻几个产品中最差的产品。评选的标准是依次找到从当前产品开始前 M 个产品中最差的产品&#xff0c;请给出最差产品的评分序列。 输…

Vue.js组件开发-图片剪裁性能优化最佳方案实例

在Vue.js组件开发中&#xff0c;优化图片剪裁性能的最佳方案通常涉及多个方面的综合考虑。以下是一个结合多个优化策略的图片剪裁组件性能优化实例&#xff1a; 1. 组件设计 首先&#xff0c;设计一个简洁且高效的图片剪裁组件&#xff0c;确保其功能明确且易于使用。组件应包…

HarmonyOS NEXT边学边玩:从零实现一个影视App(六、视频播放页的实现)

在HarmonyOS NEXT中&#xff0c;ArkUI是一个非常强大的UI框架&#xff0c;能够帮助开发者快速构建出美观且功能丰富的用户界面。本文将详细介绍如何使用ArkUI实现一个影视App的视频播放页面。将从零开始&#xff0c;逐步构建一个功能完善的视频播放页面&#xff0c;并解释每一部…

Linux——文件系统

前言&#xff1a;通过对基础IO的学习&#xff0c;可以知道&#xff1a;文件描述符用于标识已经打开的文件&#xff0c;通过数组数组下标来建立映射关系&#xff0c;而这个数组是一个指针数组&#xff0c;每个文件都有一个file对象&#xff0c;内部保存了文件相关的inode等其他信…

WPF如何跨线程更新界面

WPF如何跨线程更新界面 在WPF中&#xff0c;类似于WinForms&#xff0c;UI控件只能在UI线程&#xff08;即主线程&#xff09;上进行更新。WPF通过Dispatcher机制提供了跨线程更新UI的方式。由于WPF的界面基于Dispatcher线程模型&#xff0c;当你在非UI线程&#xff08;例如后…

FreeType 介绍及 C# 示例

FreeType 是一个开源的字体渲染引擎&#xff0c;用于将字体文件&#xff08;如 TrueType、OpenType、Type 1 等&#xff09;转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域&#xff0c;支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…

Metasploit通过ssh暴力破解

Metasploit通过ssh暴力破解 search 查询ssh_login模块 search ssh_login msf5 auxiliary(sniffer/psnuffle) > search ssh_loginMatching Modules # Name Disclosure Date Rank Check Description- ---- …

第三十九章 Spring之假如让你来写MVC——番外篇:类型转换

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…