题目:
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?
题目来源:https://oj.leetcode.com/problems/set-matrix-zeroes/
解题思路:先把第一行和第一列遍历一遍,如果有0,说明第一行或者第一列需要置0,然后用第一行和第一列的数作为额外的空间,如果matrx[i][j]=0,则把第matrix[i][0]=0,matrix[0][j]=0,最后只需要再遍历一遍矩阵,如果第一行或者第一列对应的元素为0,那么此元素赋值为0。
#include<iostream>
#include <vector>
using namespace std;
void setZeroes(vector<vector<int> > &matrix)
{
if(matrix.empty())
return ;
bool rowHasZero=false,colHasZero=false;
const int M=matrix.size();
const int N=matrix.front().size();
for(int i=0;i<N;i++)
if(matrix[0][i]==0)
{
rowHasZero=true;
break;
}
for(int j=0;j<M;j++)
if(matrix[j][0]==0)
{
colHasZero=true;
break;
}
for(int i=1;i<M;i++)
for(int j=1;j<N;j++)
if(matrix[i][j]==0)
{
matrix[i][0]=0;
matrix[0][j]=0;
}
for(int i=1;i<M;i++)
for(int j=1;j<N;j++)
if(matrix[i][0]==0 || matrix[0][j]==0)
matrix[i][j]=0;
if(rowHasZero)
for(int i=0;i<N;i++)
matrix[0][i]=0;
if(colHasZero)
for(int i=0;i<M;i++)
matrix[i][0]=0;
}
int main()
{
int A[9]={1,2,3,4,5,6,0,7,0};
vector<vector<int> > matrix;
matrix.push_back(vector<int>(A,A+3));
matrix.push_back(vector<int>(A+3,A+6));
matrix.push_back(vector<int>(A+6,A+9));
system("pause");
return 0;
}