力扣 题目73- 矩阵置零
题目
题解
其实思考一下就知道 我们必须记录一下遍历时0的xy 然后根据记录再去放0
但是如果我们使用其他容器去记录那么我们遍历完还要遍历 记录容器 时间复杂度肯定会搞
有没有一种方法可以在当前容器记录呢?
我们使用第一行与第一列记录 如果
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
这样我们只要重新遍历第一列与第一行 根据0再放对行列至0即可
但是我们发现第一列与第一行的处理有点问题 遍历会导致变0 然后导致其他全为0 所以我们需要提前遍历 看看是否有0 特殊处理 如果有则最后再将第一列或第一行放0
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 void setZeroes(vector<vector<int>>& matrix) { 7 bool rowFlag = false; 8 bool colFlag = false; 9 //看看第一列行否有0 10 for (int j = 0; j < matrix[0].size(); j++) { 11 if (matrix[0][j] == 0) { 12 rowFlag = true; 13 break; 14 } 15 } 16 //看看第一列是否有0 17 for (int i = 0; i < matrix.size(); i++) { 18 if (matrix[i][0] == 0) { 19 colFlag = true; 20 break; 21 } 22 } 23 24 for (int i = 1; i < matrix.size(); i++) { 25 for (int j = 1; j < matrix[i].size(); j++) { 26 if (matrix[i][j] == 0) { 27 matrix[0][j] = 0; 28 matrix[i][0] = 0; 29 } 30 } 31 } 32 //遍历看对应的第一列是否为0 33 for (int i = 1; i < matrix.size(); i++) { 34 if (matrix[i][0] == 0) { 35 for (int j = 0; j < matrix[i].size(); j++) { 36 matrix[i][j] = 0; 37 } 38 } 39 } 40 //遍历看对应的第一行是否为0 41 for (int j = 1; j < matrix[0].size(); j++) { 42 if (matrix[0][j] == 0) { 43 for (int i = 0; i < matrix.size(); i++) { 44 matrix[i][j] = 0; 45 } 46 } 47 } 48 //特殊处理第一列 49 if (colFlag) { 50 for (int i = 0; i < matrix.size(); i++) { 51 matrix[i][0] = 0; 52 } 53 } 54 55 //特殊处理第一行 56 if (rowFlag) { 57 for (int j = 0; j < matrix[0].size(); j++) { 58 matrix[0][j] = 0; 59 } 60 } 61 62 63 64 } 65 }; 66 67 int main() { 68 Solution sol; 69 vector<vector<int>> matrix = { {0, 1, 2, 0},{3, 4, 5, 2},{1, 3, 1, 5} }; 70 sol.setZeroes(matrix); 71 for (int i = 0; i < matrix.size(); i++) { 72 for (int j = 0; j < matrix[i].size(); j++) { 73 cout << matrix[i][j]<<" "; 74 } 75 cout << endl; 76 } 77 78 }