题目描述:
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
解法:
思路一:
- 首先遍历matrix,找到存在0的行和列,然后将对应的行和列记录到HshSet中
- 再次遍历matrix,找到HashSet中对应的0所在的位置,然后将所在的行和都置为0
- 时间复度为O(m*n);空间复杂度为:O(m+n)
详细代码:
class Solution {
public void setZeroes(int[][] matrix) {
Set<Integer> row_zero = new HashSet<>();
Set<Integer> col_zero = new HashSet<>();
int m = matrix.length;
int n = matrix[0].length;
for(int i = 0; i <m ; i ++){
for(int j = 0 ; j < n ; j ++){
if(matrix[i][j]==0){
row_zero.add(i);
col_zero.add(j);
}
}
}
for(int i = 0 ; i < m ; i++){
for(int j = 0 ; j <n;j++){
if(row_zero.contains(i)||col_zero.contains(j)){
matrix[i][j] =0;
}
}
}
}
}
思路二:
- 将第一行和第一列作为标志位,如果在数组的其他行和列中发现有0,则将该元素对应的所在的第一行和第一列的元素置为0,在此过程中需要设置两个Boolean类型的变量,来记录第一行和第一列的初始状态是否有0 存在
- 置0,遍历除了第一行和第一列的所有元素将对应的行列中第一行和第一列中存在0的行和列都置为0
- 最后根据booean的值,选择将第一行的第一列是否置0
- 时间复杂度:O(m*n);空间复杂度:O(1);
详细代码:
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean row0_flag = false;
boolean col0_flag = false;
//遍历第一行是否有0
for(int i = 0 ; i <n;i++ ){
if(matrix[0][i] ==0){
row0_flag=true;
break;
}
}
//遍历第一列是否有0
for(int j = 0 ; j < n ; j++){
if(matrix[j][0]==0){
col0_flag=true;
break;
}
}
//以第一行和第一列为标志位
for(int i = 1 ; i <m ; i ++){
for(int j = 1 ; j < n ; j ++){
if(matrix[i][j]==0){
matrix[0][j]=0;
matrix[i][0]=0;
}
}
}
//置0
for(int i = 1 ; i <m ; i ++){
for(int j = 1 ; j < n ; j ++){
if(matrix[0][j]==0||matrix[i][0]==0){
matrix[i][j]=0;
}
}
}
if(row0_flag){
for(int i = 0 ; i <n ;i++){
matrix[0][i] =0;
}
}
if(col0_flag){
for(int j = 0 ; j <m ;j++){
matrix[j][0]=0;
}
}
}
}