题目描述
给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法。
拓展:
你的算法有使用额外的空间吗?
一种比较直接的算法是利用O(m,n)的空间,但是这不是一个好的解法
使用简单的改进可以在O(m+n)的空间解决这个问题,但是还不是最佳的解法
你能在常量级的空间复杂度内解决这个问题吗?
思路:设置一个辅助数组fuzu[][],长度和宽度和原数组一样。并将所有元素初始化为0,逐行逐列依个扫描matrix数组,若有元素为0则将相同位置的辅助数组元素赋值为1。之后扫描一遍辅助数组若有元素为1则将对应位置的matrix数组的所在行和所在列所有元素赋为0。
Java特殊用法:Arrays.fill()方法,这里不详细阐述。
import java.util.Arrays;
public class Solution {
public void setZeroes(int[][] matrix) {
int i,j;
//获取二维数组的长和宽
int height=matrix.length;
int width=matrix[0].length;
int fuzu[][]=new int[height][width];
for(i=0;i<height;i++)
Arrays.fill(fuzu[i],0);
for(i=0;i<height;i++)
for(j=0;j<width;j++){
if(matrix[i][j]==0)
fuzu[i][j]=1;
}
for(i=0;i<height;i++)
for(j=0;j<width;j++){
if(fuzu[i][j]==1){
for(int n=0;n<width;n++)
matrix[i][n]=0;
for(int m=0;m<height;m++)
matrix[m][j]=0;
}
}
}
}