https://leetcode.cn/problems/zero-matrix-lcci/description/
编写一种算法,若
M
×
N
M\times N
M×N 矩阵中某个元素为
0
0
0,则将其所在的行与列清零。
這題的描述像不像童年游戲坦克大戰吼?出現 0 我們就把這一行和這一列都置為0。
那我們用兩個循環做做看,用標記陣列
的方式來做。
第一次循環就是找 0,找到 0 之後我們做標記。創建兩個 vector
類型的變數作爲標志,分別是 row
和 col
來標記行和列。
vector<int> row(m), col(n);
- 這裏的 m 和 n 指的是矩陣行列長度,我們可以用 size 接口拿到:
int m = matrix.size();
int n = matrix[0].size();
如果找到 0 我們就把這一行或這一列設置爲 true
,循環式如下:
∑
i
=
0
m
∑
j
=
0
n
(
m
a
t
r
i
x
[
i
]
[
j
]
=
0
)
→
r
o
w
[
i
]
=
c
o
l
[
j
]
=
t
r
u
e
\sum_{i=0}^{m}\sum_{j=0}^{n} (matrix[i][j]=0)\rightarrow row[i]=col[j]=true
i=0∑mj=0∑n(matrix[i][j]=0)→row[i]=col[j]=true
標記好了,第二次循環我們就來完成置 0 的操作,如果碰到標記位 row,col 是 true 則設置爲 0,循環式如下:
∑
i
=
0
m
∑
j
=
0
n
(
r
o
w
[
i
]
∨
c
o
l
[
j
]
)
→
m
a
t
r
i
x
[
i
]
[
j
]
=
0
\sum_{i=0}^{m}\sum_{j=0}^{n} (row[i]\, \vee\, col[j])\rightarrow matrix[i][j]=0
i=0∑mj=0∑n(row[i]∨col[j])→matrix[i][j]=0
🚩 程式如下:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
vector<int> row(m);
vector<int> col(n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
row[i] = col[j] = true;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] == true || col[j] == true) {
matrix[i][j] = 0;
}
}
}
}
};