給定 m×n 矩陣,若某元素為 0,將其所在行、列全部置 0。要求原地修改,空間復雜度 O(1)。
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<bool> row(m, false), col(n, false);
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)
if (row[i]) fill(matrix[i].begin(), matrix[i].end(), 0);
for (int j = 0; j < n; ++j)
if (col[j]) for (int i = 0; i < m; ++i) matrix[i][j] = 0;
}
核心思想:用 matrix[0][j] 標記第 j 列需置零,用 matrix[i][0] 標記第 i 行需置零。但首行首列本身也可能需置零,需額外兩個標記變量。
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
bool firstRowZero = false, firstColZero = false;
// 1. 檢查首行首列
for (int j = 0; j < n; ++j) if (matrix[0][j] == 0) { firstRowZero = true; break; }
for (int i = 0; i < m; ++i) if (matrix[i][0] == 0) { firstColZero = true; break; }
// 2. 內部元素標記首行首列
for (int i = 1; i < m; ++i)
for (int j = 1; j < n; ++j)
if (matrix[i][j] == 0)
matrix[i][0] = matrix[0][j] = 0;
// 3. 根據標記置零內部
for (int i = 1; i < m; ++i)
for (int j = 1; j < n; ++j)
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
// 4. 處理首行首列
if (firstRowZero) for (int j = 0; j < n; ++j) matrix[0][j] = 0;
if (firstColZero) for (int i = 0; i < m; ++i) matrix[i][0] = 0;
}