给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 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)
的额外空间,但这仍然不是最好的解决方案。通过次数
286.9K
提交次数
446.4K
通过率
64.3%
一、先遍历一次矩阵,用一个数组row和一个数组col标记要置零的行和列,随后再遍历一次矩阵,如果矩阵所在行或列要置0,那就变零。时间复杂度O(m*n),空间复杂度O(m+n)
代码:
- class Solution {
- public:
- void setZeroes(vector
int >>& matrix) { - int m=matrix.size();
- int n=matrix[0].size();
- //记录要置零的行和列
- vector<int> row(m,0);
- vector<int> col(n,0);
- for(int i=0;i
- for(int j=0;j
- if(matrix[i][j]==0)
- row[i]=col[j]=1;
- for(int i=0;i
- for(int j=0;j
- if(row[i]==1||col[j]==1)
- matrix[i][j]=0;
- }
- };
二、方法一的改进,矩阵的第一行和第一列代替col和row,实现O(1)空间复杂度,但矩阵的第一行和第一列有交叉,交叉的位置既要标记第一行是否出现零,又要标记第一列是否出现零,所以我们应该额外设置一个变量flag,flag与matrix[0][0]一个标记第一行是否出现零,一个标记第一列是否出现零。
代码:
- lass Solution {
- public:
- void setZeroes(vector
int >>& matrix) { - int m=matrix.size();
- int n=matrix[0].size();
- bool flag_col0=false;
- //标记
- for(int i=0;i
- {
- if(matrix[i][0]==0) flag_col0=true;
- for(int j=1;j
- {
- if(matrix[i][j]==0)
- matrix[i][0]=matrix[0][j]=0;
- }
- }
- // 置零
- for(int i=1;i
- {
- for(int j=1;j
- {
- if(matrix[i][0]==0||matrix[0][j]==0)
- matrix[i][j]=0;
- }
- }
- if(matrix[0][0]==0)
- for(int j=0;j
0][j]=0; - if(flag_col0==true)
- for(int j=0;j
0]=0; - }
- };
-
相关阅读:
爬虫代理ip池创建【使用redis TTL实现】
Python-代码封装思想
Windows窗体程序开启console(cmd命令行)
【ARM】使用Ubuntu-base构建根文件系统
循环赛-(单循环)
Django面试题和出现的一些问题
利用torch.nn实现softmax回归Fashion-MNIST数据集上进行训练和测试
javaweb01
CSS进阶(2)- 块级格式化上下文
Vue中父子组件通信方式
-
原文地址:https://blog.csdn.net/m0_73441691/article/details/134087876