题目
这道题的本质就是要用个额外空间来标记每一行和每一列是否存在0,如果存在的话,那么这一行或者这一列都要变为0。
方法一:
用两个数组分别代表每一行和每一列
class Solution {
public void setZeroes(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
boolean[] flagRow = new boolean[row];
boolean[] flagCol = new boolean[col];
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j]==0){
flagRow[i] = true;
flagCol[j] = true;
}
}
}
for(int i=0;i<row;i++){
if(flagRow[i]){
for(int j=0;j<col;j++){
matrix[i][j] = 0;
}
}
}
for(int j=0;j<col;j++){
if(flagCol[j]){
for(int i=0;i<row;i++){
matrix[i][j] = 0;
}
}
}
}
}
方法二:
要求要用O(1)的额外空间,其实就是在数组的本身上操作。问题的关键点就在于如果每一行都存在0,那么整个数组就都会变为0.如果存在一行其中不包含0.那么就可以用这一行来进行标记。因为这一行最终并不会全部变为0.所以这一行的每一个位置记录的是这个位置对应的这一列是否存在0.
class Solution {
public void setZeroes(int[][] matrix) {
int nonZero = -1;
int row = matrix.length,col = matrix[0].length;
for(int i=0;i<row;i++){
int j = 0;
for(j=0;j<col;j++){
if(matrix[i][j]==0){
break;
}
}
if(j==col){
nonZero = i;
break;
}
}
if(nonZero==-1){
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
matrix[i][j] = 0;
}
}
}else{
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j]==0){
matrix[nonZero][j] = 0;
}
}
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(i==nonZero) continue;
if(matrix[i][j]==0){
for(int j2=0;j2<col;j2++){
matrix[i][j2] = 0;
}
}
}
}
for(int j=0;j<col;j++){
if(matrix[nonZero][j]==0){
for(int i=0;i<row;i++){
matrix[i][j] = 0;
}
}
}
}
}
}