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

leetcode_73 矩阵置零

1. 题意

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

2. 题解

想不到O(1)的空间复杂度的做法,

只有抄抄题解这样子才能维持的了生活。

2.1 暴力

维护两个标记数组,分别表示某行或者某列有0。

时间复杂度O(n)O(n)O(n)

空间复杂度O(n)O(n)O(n)

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( r )c = matrix[0].size();vector<int> row_flags(r, 0);vector<int> col_flags(c, 0);for (int i = 0;i < r; ++i) {for (int j = 0;j < c; ++j) {if (0 == matrix[i][j]) {row_flags[i] = col_flags[j] = 1;}}}for (int i = 0;i < r; ++i) {for (int j = 0; j < c; ++j) {if (row_flags[i] || col_flags[j])matrix[i][j] = 0;}}}
};
2.2 原地算法

用数组的第一行和第一列分别来表示,某一列或者某一行它有0。

我们用0来表示有0,因为这样就不用考虑第0行和第0列的情况了。

在用0行和第0列表示之前, 我们需要用两个变量先预处理出第0行

和第0列的情况。

在这里插入图片描述
其实就是

nums[i][0]表示第i行有没有0;

nums[0][j]表示第j列有没有0;

其中0<i<rows,0<j<cols

而第0行和第0列就用first_col first_rol单独进行判断了。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( 0 != r)c = matrix[0].size();int first_col = 0;int first_row = 0;for (int i = 0;i < c; ++i) {if ( matrix[0][i] == 0) {first_row = 1;break;}}for (int i = 0; i < r; ++i) {if ( matrix[i][0] == 0) {first_col = 1;break;}}for (int i = 1; i < r; ++i) {for (int j = 1; j < c; ++j) {if ( matrix[i][j] == 0) {matrix[0][j] = 0;matrix[i][0] = 0;}   }}for (int i = 1; i < r; ++i) {for (int j = 1; j < c; ++j) {if (matrix[0][j] == 0 || matrix[i][0] == 0)matrix[i][j] = 0;}}if (first_col) {for (int i = 0;i < r; ++i)matrix[i][0] = 0;}if (first_row) {for (int i = 0;i < c; ++i)matrix[0][i] = 0;}}
};

而题解中维护一个变量的做法,

其实就是把nums[0][0]这个位置再拿去

表示第0行有0或者第0列有0从而省略掉一个变量。

但这样做其实增加了复杂度,以nums[0][0]表示第0列有无0来说。

在这里插入图片描述
对于nums[0][j]=0 , j>0来说,它不能引起nums[0][0]的更新,

因为nums[0][0]表示的是第0列的状况,而不是第0行的状况了。

因此需要加一个判断了。

其次在最后遍历数组的时候,我们需要逆序的列遍历了。

因为如果顺序的话nums[i][0]表示的行信息就被覆盖掉了。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( 0 != r)c = matrix[0].size();int first_row = 0;for (int i = 0;i < c; ++i) {if ( matrix[0][i] == 0) {first_row = 1;break;}}for (int i = 0; i < r; ++i) {for (int j = 0; j < c; ++j) {if ( matrix[i][j] == 0) {matrix[0][j] = 0;if ( i != 0 )matrix[i][0] = 0;}   }}for (int i = 1; i < r; ++i) {// be carefull here, we need traversal reverse orderfor (int j = c - 1; ~j; --j) {if (matrix[0][j] == 0 || matrix[i][0] == 0)matrix[i][j] = 0;}}if (first_row) {for (int i = 0;i < c; ++i)matrix[0][i] = 0;}}
};

如果用nums[0][0]表示第0行的状况也是相似的,代码也给出来吧。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( 0 != r)c = matrix[0].size();int first_col = 0;for (int i = 0;i < r; ++i) {if ( matrix[i][0] == 0) {first_col = 1;break;}}for (int i = 0; i < r; ++i) {for (int j = 0; j < c; ++j) {if ( matrix[i][j] == 0) {matrix[i][0] = 0;if (j != 0)matrix[0][j] = 0;}   }}for (int i = r - 1; ~i; --i) {for (int j = 1;j < c; ++j) {if ( matrix[0][j] == 0 || matrix[i][0] == 0 ) {matrix[i][j] = 0;}}}if (first_col) {for (int i = 0;i < r; ++i)matrix[i][0] = 0;}}
};

空间复杂度O(1)O(1)O(1)

3. 参考

leetcode

http://www.dtcms.com/a/355321.html

相关文章:

  • (LeetCode 面试经典 150 题) 103. 二叉树的锯齿形层序遍历(广度优先搜索bfs)
  • [n8n] 工作流数据库管理SQLite | 数据访问层-REST API服务
  • 解决PyCharm打开PowerShell终端报错找不到conda-hook.ps1文件
  • 前端javascript在线生成excel,word模板-通用场景(免费)
  • Spring Boot 定时任务入门
  • 使用Java实现PDF文件安全检测:防止恶意内容注入
  • ubuntu20安装lammps
  • PDFMathTranslate,完全免费的电脑 PDF 文档翻译软件
  • 怎么保护信息安全?技术理论分析
  • Shell 脚本编程规范与变量
  • [调试][实现][原理]用Golang实现建议断点调试器
  • 裸金属服务器与虚拟机、物理机的核心差异是什么?
  • 鸿蒙Harmony-从零开始构建类似于安卓GreenDao的ORM数据库(二)
  • Kea DHCP高危漏洞CVE-2025-40779:单个数据包即可导致服务器崩溃
  • 获取小红书某个用户列表
  • Swift 解法详解 LeetCode 365:水壶问题
  • day083-Filebeat数据采集案例与Kibana可视化应用
  • Leetcode 494. 目标和 动态规划-01背包
  • 【踩坑记录】SpringBoot 项目报 Communications link failure 的解决方法
  • 数据结构初阶:详解双链表
  • 在angular20中使用monaco-editor
  • LLM Agent工具设计规范总结
  • Python 实现归并排序:从原理到代码
  • Ansys Electronics Desktop 2025 R2 软件界面介绍
  • open webui源码分析10-四个特征之搜索
  • 系统架构师-软件工程
  • 前端响应式设计
  • 推荐系统王树森(五)重排多样性提升
  • 银河麒麟桌面操作系统:为什么不让root直接登录图形界面?以及如何安全地解决这个问题
  • 英伟达营收和利润均超出市场预期,但盘后一度跌超5%