https://leetcode-cn.com/problems/set-matrix-zeroes/
解答:
两种方法时间复杂度都为O(mn)
O(m+n)空间方法:
用两个容器储存为0的行和列
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { //O(m+n)额外空间,常数空间??? set<int> rse,cse; int r=matrix.size();int c=matrix[0].size(); for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ if(matrix[i][j]==0){ rse.insert(i); cse.insert(j); } } } while(!rse.empty()){ int temp=*rse.begin(); for(int j=0;j<c;j++){ matrix[temp][j]=0; } rse.erase(rse.begin()); } while(!cse.empty()){ int temp=*cse.begin(); for(int i=0;i<r;i++){ matrix[i][temp]=0; } cse.erase(cse.begin()); } } };
常数空间方法:
对于第0行和第0列的数据如果有0,则标记isrow=true, iscol=true来记录是否为0;
对于1~m行和1~n列的数据如果有0,则将其标注在第0行,第0列;即
i : 1~m-1 j: 1~n-1 if(matrix[i][j]==0) matrix[i][0]=0,matrix[0][j]=0;
C++ code:
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { //常数空间解决方案 //标记第0行和第0列是否为0; bool isrow=false; bool iscol=false; int r=matrix.size(); int c=matrix[0].size(); for(int j=0;j<c;j++){ if(matrix[0][j]==0){ isrow=true;break; } } for(int i=0;i<r;i++){ if(matrix[i][0]==0){ iscol=true;break; } } //标记1~n列是否为0,将结果放入第0行和第0列; for(int i=1;i<r;i++){ for(int j=1;j<c;j++){ if(matrix[i][j]==0){ matrix[i][0]=0; matrix[0][j]=0; } } } //先将1~n行列的值替换 for(int i=1;i<r;i++){ if(matrix[i][0]==0){ for(int j=0;j<c;j++){ matrix[i][j]=0; } } } for(int j=1;j<c;j++){ if(matrix[0][j]==0){ for(int i=0;i<r;i++){ matrix[i][j]=0; } } } //再替换0行和0列 if(isrow){ for(int j=0;j<c;j++){ matrix[0][j]=0; } } if(iscol){ for(int i=0;i<r;i++){ matrix[i][0]=0; } } } };
原文地址:https://www.cnblogs.com/joelwang/p/11896781.html
时间: 2024-10-10 07:08:34