

方法一:O(MN)
java
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
//申请一个和原矩阵完全等大的新矩阵
int[][] copy = new int[m][n];
//把旧矩阵的数据原封不动地搬过来
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
copy[i][j] = matrix[i][j];
}
}
//看着原矩阵 (copy) 找 0,在真实矩阵 (matrix)处理
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (copy[i][j] == 0) {
for (int k = 0; k < n; k++) {
matrix[i][k] = 0;
}
for (int k = 0; k < m; k++) {
matrix[k][j] = 0;
}
}
}
}
}
}
方法二:O(M+N)
java
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
//记录每一行和每一列的状态
//boolean数组默认全是false
boolean[] rowDeathList = new boolean[m];
boolean[] colDeathList = new boolean[n];
//全矩阵扫描,填写状态
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
rowDeathList[i] = true;
colDeathList[j] = true;
}
}
}
//根据状态给矩阵置0
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (rowDeathList[i] || colDeathList[j]) {
matrix[i][j] = 0;
}
}
}
}
}
方法三:O(1)
java
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
//只用于处理第一列设置的变量
boolean firstColHasZero = false;
//遍历,在第一行和第一列置0(设置状态)
for(int i = 0; i < m; i++){
if(matrix[i][0] == 0){
firstColHasZero = true;
}
for(int j = 1; j < n; j++){
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//遍历,将需要的行和列置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(matrix[0][0] == 0){
for(int j = 0; j < n; j++){
matrix[0][j] = 0;
}
}
if(firstColHasZero){
for(int i = 0; i < m; i++){
matrix[i][0] = 0;
}
}
}
}
1.空间复杂度为O(MN)方法:开辟新的矩阵
2.空间复杂度为O(M+N)方法:两个一维数组用于行记录和列记录
3.空间复杂度O(1)将原数组的某部分当作状态数组
步骤:
(1)第一行/第一列专门记录哪行/列设为0
因为[0][0]既属于第一行又属于第一列,我们让它只管第一行,然后再引入一个变量firstColHasZero专门负责第一列
先扫第一列只要有0,直接将firstColHasZero置为true
因为第一列已经清楚了,所以直接从j=1开始往后扫,扫描中,只要[i][j]为0,将[i][0],[0][j]置为0
现在就统计好应该设为0的行和列了
(2)根据将刚才第一行第一列的状态,开始将矩阵符合条件的行列置为0,防止一上来将第一行第一列元素置为0导致后面元素误设为0,所以从i,j为1的位置开始
(3)最后处理第一行和第一列,[0][0]如果是0,将第一行置为0;firstColHasZero如果是true这一列直接置为0