problem:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
Hide Tags
题意:矩阵出现0,则将改行和该列置0,注意不要讲矩阵全部置0
thinking:
(1)这道题的实现不难,难在怎么样控制空间复杂度
(2)空间复杂度为O(m*n)的方法不谈,太简单了。空间复杂度为O(m+n)的方法也容易实现,单独开两个数组记录行和列
(3)重点介绍 空间复杂度为 O(1)的方法:
这里只使用两个BOOL 变量即可搞定
1、bool flag_row、 flag_col分别记录首行和首列是否有0
2、从第二行和第二列开始遍历,如果出现0,则将首行和首列的对应位置 置0
3、2第二步完成之后,也是从第二行和第二列开始根据首行和首列信息填充0;
4、根据第一步的信息填充首行和首列
该方法是利用首行和首列来保存信息,注意首行和首列要单独处理。
code:
class Solution { public: void setZeroes(vector<vector<int> > &matrix) { if(matrix.size()==0) return; int m=matrix.size(); int n=matrix[0].size(); bool flag_row=false; bool flag_col=false; /*先考虑单列或者单行的特殊情况*/ if(m==1) { bool flag=false; for(int i=0;i<n;i++) if(matrix[0][i]==0) flag=true; if(flag) { for(int i=0;i<n;i++) matrix[0][i]=0; } return; }//m==1 if(n==1) { bool flag=false; for(int i=0;i<m;i++) if(matrix[i][0]==0) flag=true; if(flag) { for(int i=0;i<m;i++) matrix[i][0]=0; } return; }//n==1 for(int i=0;i<m;i++)//第一列是否有0,记录 { if(matrix[i][0]==0) { flag_col=true; break; } } for(int j=0;j<n;j++)//第一行是否有0,记录 { if(matrix[0][j]==0) { flag_row=true; break; } } for(int i=1;i<m;i++) //从第二行第二列开始,如果出现0,将第一行和第一列的对应位置置0 for(int j=1;j<n;j++) { if(matrix[i][j]==0) { matrix[0][j]=0; matrix[i][0]=0; } } for(int i=1;i<m;i++)//逐行检查置0 { if(matrix[i][0]==0) { for(int j=1;j<n;j++)//从第二列开始 matrix[i][j]=0; } } for(int j=1;j<n;j++)//逐列检查,从第二行开始 { if(matrix[0][j]==0) { for(int i=1;i<m;i++) matrix[i][j]=0; } } if(flag_col) //检查第一列 { for(int i=0;i<m;i++) matrix[i][0]=0; } if(flag_row) //检查第一行 { for(int j=0;j<n;j++) matrix[0][j]=0; } } };
时间: 2024-12-15 23:30:49