タイトル |
トピックポータル:ポータル(こちらをクリック)
問題の解決策 |
- スペースの複雑さはO(MN)ソリューションであるアウトだと思うのは簡単です
- O(M + N)は比較的簡単な解決策であり、空間の複雑さは、2つの配列は、mおよび長さnは、行または列を介して0に表示されるように作成します
- 空間複雑度が2に基づいて、溶液中のO(1)であり、マトリックス中のこの配列は、記録します
私の考え
- 第0見出し、このカラムを通過し、このラインは、行と列の0として記録されている
最初の行第2列、1行2列目に最初に見つかった0、それは次のように記録されています行と列
- 、見下ろしキープそれぞれ0を発見し、それがこの行に記録され、
- 良い記録した後、最初のゼロの列
- そして、ゼロライン
コード
class Solution {
public void setZeroes(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
int recRow = -1;
int recCol = -1;
// 把有 0 的行和列都记录到 recRow 和 recCol 中
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (matrix[i][j] == 0) {
if (recRow == -1 && recCol == -1) {
recRow = i;
recCol = j;
} else {
matrix[recRow][j] = 0;
matrix[i][recCol] = 0;
}
}
}
}
// 如果矩阵中没有 0 ,就直接返回
if (recCol == -1 && recRow == -1) return;
// 将 recRow 记录的所有的行设置为 0
for (int j = 0; j < cols; j++) {
if (j != recCol) {
if (matrix[recRow][j] == 0) {
for (int i = 0; i < rows; i++) {
matrix[i][j] = 0;
}
} else {
matrix[recRow][j] = 0;
}
}
}
// 将 recCol 记录的所有的列设置为 0
for (int i = 0; i < rows; i++) {
if (i != recRow) {
if (matrix[i][recCol] == 0) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = 0;
}
} else {
matrix[i][recCol] = 0;
}
}
}
}
}