题目描述
思路分析
模
拟
题
模拟题
模拟题
暴
力
做
法
就
不
再
解
释
了
,
无
非
开
数
组
,
遍
历
等
等
。
暴力做法就不再解释了,无非开数组,遍历等等。
暴力做法就不再解释了,无非开数组,遍历等等。
这
里
说
下
最
优
做
法
。
时
间
复
杂
度
O
(
n
2
)
,
空
间
复
杂
度
O
(
1
)
这里说下最优做法。时间复杂度O(n^2),空间复杂度O(1)
这里说下最优做法。时间复杂度O(n2),空间复杂度O(1)
h
a
n
g
0
记
录
第
0
行
是
否
变
成
0
,
l
i
e
0
记
录
第
0
列
是
否
变
成
0
,
hang0记录第0行是否变成0,lie0记录第0列是否变成0,
hang0记录第0行是否变成0,lie0记录第0列是否变成0,
之
后
借
用
第
0
行
和
第
0
列
的
空
间
分
别
表
示
某
列
和
某
行
是
否
要
变
为
0
(
这
一
步
遍
历
即
可
)
之后借用第0行和第0列的空间分别表示某列和某行是否要变为0(这一步遍历即可)
之后借用第0行和第0列的空间分别表示某列和某行是否要变为0(这一步遍历即可)
然
后
就
是
先
把
除
了
第
0
行
和
第
0
列
之
外
的
矩
阵
置
0
,
最
后
考
虑
第
然后就是先把除了第0行和第0列之外的矩阵置0,最后考虑第
然后就是先把除了第0行和第0列之外的矩阵置0,最后考虑第
0
行
和
第
0
列
即
可
。
注
意
这
个
顺
序
不
能
乱
!
0行和第0列即可。注意这个顺序不能乱!
0行和第0列即可。注意这个顺序不能乱!
因
为
我
们
要
借
用
第
0
行
和
第
0
列
,
因
此
最
后
才
能
操
作
第
0
行
和
第
0
列
。
因为我们要借用第0行和第0列,因此最后才能操作第0行和第0列。
因为我们要借用第0行和第0列,因此最后才能操作第0行和第0列。
代码实现
class Solution {
public:
void setZeroes(vector<vector<int>>& g) {
if(g.empty()||g[0].empty()) return;
int n=g.size(),m=g[0].size();
bool hang0=false,lie0=false;
for(int i=0;i<m;i++) if(!g[0][i]) hang0=true;
for(int i=0;i<n;i++) if(!g[i][0]) lie0=true;
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(!g[i][j]){
g[i][0]=g[0][j]=0;
}
}
}
for(int i=1;i<n;i++){
if(!g[i][0]){
for(int j=0;j<m;j++) g[i][j]=0;
}
}
for(int j=1;j<m;j++){
if(!g[0][j]){
for(int i=0;i<n;i++) g[i][j]=0;
}
}
if(hang0) for(int i=0;i<m;i++) g[0][i]=0;
if(lie0) for(int i=0;i<n;i++) g[i][0]=0;
}
};