JAVA算法练习题day15
矩阵
18.矩阵置零
明天要去雁栖湖,先把明天的题做了,明天记得发学习笔记。
我的疑问:遍历该矩阵不就需要o(n^2)了吗。所以不用考虑时间复杂度会超。
根据题意的o(n+m)空间,好想出:开两个数组记录某行、某列是否含0:
class Solution {public void setZeroes(int[][] matrix) {int row = matrix.length;int col = matrix[0].length;Set<Integer> row_0 = new HashSet<Integer>();Set<Integer> col_0 = new HashSet<Integer>();for(int i = 0;i<row;i++){for(int j = 0;j<col;j++){if(matrix[i][j]==0){row_0.add(i);col_0.add(j);}}}for(int i = 0;i<row;i++){for(int j = 0;j<col;j++){if(row_0.contains(i)||col_0.contains(j)) matrix[i][j]=0;}}}
}
启发:1.如果题目要求优化空间复杂度,那么我们要想到“原地”来做。2.把数据结构画出来写出来,然后就能仔细分析了,而不是空想代码(这样往往只能想到暴力法)。
class Solution {public void setZeroes(int[][] matrix) {int row = matrix.length;int col = matrix[0].length;//原地,用第一行第一列来标记。相当于充当之前的两个哈希数组,但是要注意的是:他们本身可能含0,需要标记。boolean isrow0 = false;boolean iscol0 = false;for(int i = 0;i<row;i++){if(matrix[i][0]==0) iscol0=true;}for(int i = 0;i<col;i++){if(matrix[0][i]==0) isrow0=true;}for(int i = 1;i<row;i++){for(int j = 1;j<col;j++){if(matrix[i][j]==0){matrix[0][j]=0;matrix[i][0]=0;}}}for(int i = 1;i<row;i++){for(int j = 1;j<col;j++){if(matrix[0][j] ==0 ||matrix[i][0]==0) matrix[i][j]=0;}}for(int i = 0;i<row;i++){if(iscol0) matrix[i][0]=0;}for(int i = 0;i<col;i++){if(isrow0) matrix[0][i]=0;}}
}