【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 };

 

 

 

 

posted @ 2017-02-09 11:15  会咬人的兔子  阅读(144)  评论(0编辑  收藏  举报