【43】73. Set Matrix Zeroes
73. Set Matrix Zeroes
Description Submission Solutions Add to List
- Total Accepted: 91009
- Total Submissions: 258173
- Difficulty: Medium
- Contributors: Admin
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Solution:
这道题中说的空间复杂度为O(mn)的解法自不用多说,直接新建一个和matrix等大小的矩阵,然后一行一行的扫,只要有0,就将新建的矩阵的对应行全赋0,行扫完再扫列,然后把更新完的矩阵赋给matrix即可,这个算法的空间复杂度太高。将其优化到O(m+n)的方法是,用一个长度为m的一维数组记录各行中是否有0,用一个长度为n的一维数组记录各列中是否有0,最后直接更新matrix数组即可。这道题的要求是用O(1)的空间,那么我们就不能新建数组,我们考虑就用原数组的第一行第一列来记录各行各列是否有0.
- 先扫描第一行第一列,如果有0,则将各自的flag设置为true
- 然后扫描除去第一行第一列的整个数组,如果有0,则将对应的第一行和第一列的数字赋0
- 再次遍历除去第一行第一列的整个数组,如果对应的第一行和第一列的数字有一个为0,则将当前值赋0
- 最后根据第一行第一列的flag来更新第一行第一列
1 class Solution { 2 public: 3 void setZeroes(vector<vector<int>>& matrix) { 4 if(matrix.empty() || matrix[0].empty()) return;//此时用empty算 5 int m = matrix.size(); 6 int n = matrix[0].size(); 7 bool row = false, col = false; 8 for(int i = 0; i< m; i++){//扫第一列,看有没有对应的行数是0的 9 if(matrix[i][0] == 0) col = true;//COL!!!!!!!!!!! 10 } 11 for(int i = 0; i < n; i++){ 12 if(matrix[0][i] == 0) row = true;//同上扫第一行 13 } 14 15 for(int i = 1; i < m; i++){ 16 for(int j = 1; j < n; j++){ 17 if(matrix[i][j] == 0){//从第二行列开始扫,遇见0,则把其对应的行头列头设为0 18 matrix[i][0] = 0; 19 matrix[0][j] = 0; 20 } 21 } 22 } 23 24 for(int i = 1; i < m; i++){ 25 for(int j = 1; j < n; j++){ 26 if(matrix[i][0] == 0 || matrix[0][j] == 0){//从第二行列扫,如果行头或列头是0,则更新全行全列是0 27 matrix[i][j] = 0; 28 } 29 } 30 } 31 32 if(row){//最后更新第一行与第一列 33 for(int i = 0; i < n; i++){ 34 matrix[0][i] = 0; 35 } 36 } 37 if(col){ 38 for(int i = 0; i < m; i++){//col全是对应m的 39 matrix[i][0] = 0; 40 } 41 } 42 //return matrix; 43 } 44 };