給定 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;
}
firstRowZero, firstColZero)。,若 matrix[i][j]==0,標記 和 。firstRowZero, firstColZero 處理首行首列。void setZeroesO1(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
bool firstRowZero = false, firstColZero = false;
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; }
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;
for (int i = 1; i < m; i++)
if (matrix[i][0] == 0)
fill(matrix[i].begin(), matrix[i].end(), 0);
for (int j = 1; j < n; j++)
if (matrix[0][j] == 0)
for (int i = 0; i < m; i++) matrix[i][j] = 0;
if (firstRowZero) fill(matrix[0].begin(), matrix[0].end(), 0);
if (firstColZero) for (int i = 0; i < m; i++) matrix[i][0] = 0;
}
fill(first, last, val):將迭代器區間 [first, last) 賦值 val。fill_n(first, n, val):從 first 開始賦值 n 個元素。vector, array, 指針等)。vector<int> v(8); fill(v.begin(), v.begin()+4, 5); // 前 4 個置 5 fill_n(v.begin()+3, 3, 8); // 從第 3 個開始 3 個置 8 // v: 5 5 5 8 8 8 0 0
| 特性 | 指針 | 迭代器 |
|---|---|---|
| 指向對象 | 內存地址 | 容器元素(智能指針) |
| 算術運算 | 支援 | 支援(隨機訪問迭代器) |
| 解引用 | *p | *it 返回引用 |
| 輸出 | cout << p 印地址 | cout << *it 印值 |
| 類型 | 原始類型 | 類類型(封裝指針) |