矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ]示例 2:
输入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] 输出: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]进阶:
- 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
思路:o(mn)空间 第一遍遍历矩阵,用一个m*n的矩阵来记录矩阵中0的位置,再通过记录矩阵第二次遍历原始矩阵将行列置零。
o(m+n)空间 我的思路是用两个set集合,第一遍遍历的时候将0位置的行列分别记录到两个set集合中,第二次遍历时通过set集合置零。
o(1)空间 第一遍遍历矩阵时,如果第一行或者第一列有0元素,用两个flag(boolean)来记录,其余行列里如果有0元素则将矩阵的该行和列置零,第二遍扫描的时候如果matrix[0][i]或者matrix[j][0]为0,则令matrix[i][j]=0。
o(m+n):
class Solution {
public void setZeroes(int[][] matrix) {
Set<Integer> rowSet = new HashSet<>();
Set<Integer> colSet = new HashSet<>();
if(matrix.length<1) return;
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==0){
rowSet.add(i);
colSet.add(j);
}
}
}
for(int m:rowSet){
for(int k=0;k<matrix[0].length;k++){
matrix[m][k] = 0;
}
}
for(int n:colSet){
for(int k=0;k<matrix.length;k++){
matrix[k][n] = 0;
}
}
}
}
o(1):
// if(matrix.length<1) return;
// boolean firstRowIsZero = false;
// boolean firstColIsZero = false;
// for(int i=0;i<matrix.length;i++){
// for(int j=0;j<matrix[0].length;j++){
// if(i!=0&&j!=0&&matrix[i][j]==0){
// matrix[0][j] = 0;
// matrix[i][0] = 0;
// }else if(matrix[i][j]==0){
// firstRowIsZero = i==0?true:firstRowIsZero;
// firstColIsZero = j==0?true:firstColIsZero;
// }
// }
// }
// for(int i=0;i<matrix.length;i++){
// for(int j=0;j<matrix[0].length;j++){
// if(matrix[0][j]==0 || matrix[i][0]==0){
// matrix[i][j] = 0;
// }
// }
// }
// if(firstRowIsZero){
// for(int i=0;i<matrix[0].length;i++){
// matrix[0][i] = 0;
// }
// }
// if(firstColIsZero){
// for(int i=0;i<matrix.length;i++){
// matrix[i][0] = 0;
// }
// }