题目描述
链接:点我
题解
java
//法一 使用hashset记录有0的横纵坐标即可
class Solution {
public void setZeroes(int[][] matrix) {
HashSet<Integer> row = new HashSet<Integer>();
HashSet<Integer> col = new HashSet<Integer>();
for(int i = 0;i < matrix.length;i++){
for(int j = 0;j < matrix[i].length;j++){
if(matrix[i][j] == 0){
row.add(i);
col.add(j);
}
}
}
//更新
for(int i = 0;i < matrix.length;i++){
for(int j = 0;j < matrix[i].length;j++){
if(row.contains(i) || col.contains(j)){
matrix[i][j] = 0;
}
}
}
}
}
//法二,我也是看了题解才明白orz....... 此法的空间复杂度更小O(1)
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length , n = matrix[0].length;
int flag = 0; //标记第0列是否有0,有为1
for(int i = 0;i < m;i++){
if(matrix[i][0] == 0) flag = 1;
for(int j = 1;j < n;j++){
//通过其他列更新第0列,其他行更新第0行
if(matrix[i][j] == 0) matrix[i][0] = matrix[0][j] = 0;
}
}
for(int i = m-1;i >= 0;i--){//防止每一列的第一个元素被提前更新,倒着遍历
for(int j = 1;j < n;j++){ //注意这里是从1开始
if(matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0;
}
}
if(flag == 1){ //更新第0列
for(int i =0;i < m; i++) matrix[i][0] = 0;
}
}
}