题目:
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 示例 2: 输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
解法一:
public void setZeroes(int[][] matrix) {
// 1.首先寻找为0的位置 用一个list包裹map map里面 key存j value存i 因为key不能重复
List<Map<Integer,Integer>> list = new ArrayList<>();// k j v i
int dadArr = matrix.length;
for (int i=0;i<dadArr;i++){
Map<Integer,Integer> map = new HashMap<>();
for (int j=0;j<matrix[i].length;j++){
if (matrix[i][j]==0){
map.put(j,i);
}
}
list.add(map);
}
// 2.遍历list map entry
for (Map<Integer, Integer> map : list) {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
int j = entry.getKey();
int i = entry.getValue();
int subArr = matrix[i].length;
for (int x=0;x<dadArr;x++){
if (x==i)continue;
matrix[x][j] = 0;
}
for (int y=0;y<subArr;y++){
matrix[i][y] = 0;
}
}
}
}
解法二:
//具体地,我们首先遍历该数组一次,如果某个元素为 00,那么就将该元素所在的行和列所对应标记数组的位置置为 \text{true}true。最后我们再次遍历该数组,用标记数组更新原数组即可。
public void setZeroes(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
boolean[] row = new boolean[m];
boolean[] col = new boolean[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
row[i] = col[j] = true;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
}