给定一个m×n矩阵,如果一个元素是0,则将其所在行和列全部元素变成0。
需要在原矩阵上完成操作。
样例
给出一个矩阵
[
[1, 2],
[0, 3]
]
返回
[
[0, 2],
[0, 0]
]
挑战
你是否使用了额外的空间?
一个直接的解决方案是使用 O(MN) 的额外空间,但这并不是一个好的方案。
一个简单的改进方案是使用 O(M + N) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?
解题思路:
先将矩阵中所有0的坐标存储起来,然后依次对0点坐标向四周遍历归零。
public class Solution {
/**
* @param matrix: A lsit of lists of integers
* @return: nothing
*/
public void setZeroes(int[][] matrix) {
// write your code here
List<List<Integer>> zero = new ArrayList<>();
//将矩阵中所有的零点记录保存到zero中
for(int row=0; row<matrix.length; row++){
for(int col=0; col<matrix[0].length; col++){
if(matrix[row][col] == 0){
List<Integer> list = new ArrayList<Integer>();
list.add(row);
list.add(col);
zero.add(list);
}
}
}
//将矩阵所有为0的点四周依次归零
for(int i=0; i<zero.size(); i++){
int row = zero.get(i).get(0);
int col = zero.get(i).get(1);
convertZero(matrix, row, col);
}
}
//将[row, col]所在行列全部变为0
private void convertZero(int[][] matrix, int row, int col){
for(int i=0; i<matrix.length; i++)
matrix[i][col] = 0;
for(int i=0; i<matrix[0].length; i++)
matrix[row][i] = 0;
}
}