leetcode:73. 矩阵置零
题目
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:![[中等] 73. 矩阵置零 - 图1](/uploads/projects/liangduo-rjrcs@ggu4wq/0878031b58e4f26292f0c306b595a5ba.jpeg)
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:![[中等] 73. 矩阵置零 - 图2](/uploads/projects/liangduo-rjrcs@ggu4wq/bf22ee28e247320ecd591cf56fb52628.jpeg)
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
解答 & 代码
思想:用第 0 行的每一位 matrix[0][col] 代表对应的列 col 是否包含 0,用第 0 列的每一位 matrix[row][0] 代表对应的行 row 是否包含 0
另,需要预先使用额外的两个变量
row0Has0、col0Has0,分别记录第0行是否包含0,第0列是否包含0class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int rows = matrix.size(); int cols = matrix[0].size(); // 1. 用额外的两个变量分别记录第 0 行、第 0 列是否有 0,若有 0 则置为 true bool row0Has0 = false; // 第 0 行是否包含 0 bool col0Has0 = false; // 第 0 列是否包含 0 for(int col = 0; col < cols; ++col) { if(matrix[0][col] == 0) { row0Has0 = true; break; } } for(int row = 0; row < rows; ++row) { if(matrix[row][0] == 0) { col0Has0 = true; break; } } // 2. 遍历矩阵,如果某个元素 matrix[row][col] 为 0,标记该含有 0 即 matrix[row][0], // 标记该列有 0 即 matrix[0][col] = 0 for(int row = 1; row < rows; ++row) { for(int col = 1; col < cols; ++col) { if(matrix[row][col] == 0) { matrix[0][col] = 0; matrix[row][0] = 0; } } } // 3. 再次遍历矩阵,若元素所在行 or 列含 0,则将该元素置 0 for(int row = 1; row < rows; ++ row) { for(int col = 1; col < cols; ++col) { if(matrix[0][col] == 0 || matrix[row][0] == 0) matrix[row][col] = 0; } } // 4. 如果第 0 行含 0 ,则第 0 行置 0;如果第 0 列含 0,则第 0 列置 0 if(row0Has0) { for(int col = 0; col < cols; ++col) matrix[0][col] = 0; } if(col0Has0) { for(int row = 0; row < rows; ++row) matrix[row][0] = 0; } } };复杂度分析:设矩阵 m 行 n 列
时间复杂度 O(mn):
- 空间复杂度 O(1):原地
执行结果:
执行结果:通过
执行用时:12 ms, 在所有 C++ 提交中击败了 76.20% 的用户
内存消耗:12.9 MB, 在所有 C++ 提交中击败了 37.66% 的用户
