Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
[解题思路]
1.空间复杂度为:O(m+n)
1 public void setZeroes(int[][] matrix) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 if(matrix.length == 0){ 5 return; 6 } 7 int r = matrix.length; 8 int c = matrix[0].length; 9 int[] rows = new int[r]; 10 for(int i = 0; i < r; i++){ 11 rows[i] = 1; 12 } 13 int[] cols = new int[c]; 14 for(int i = 0; i < c; i++){ 15 cols[i] = 1; 16 } 17 for(int i = 0; i < r; i++){ 18 for(int j = 0; j < c; j++){ 19 if(matrix[i][j] == 0){ 20 rows[i] = 0; 21 cols[j] = 0; 22 } 23 } 24 } 25 26 for(int i = 0; i < r; i++){ 27 if(rows[i] == 0){ 28 for(int j = 0; j < c; j++){ 29 matrix[i][j] = 0; 30 } 31 } 32 } 33 34 for(int i = 0; i < c; i++){ 35 if(cols[i] == 0){ 36 for(int j = 0; j < r; j++){ 37 matrix[j][i] = 0; 38 } 39 } 40 } 41 }
2.constant space solution
常数空间,第一可以考虑是不是固定数量的几个变量能解决,否则可以考虑是不是问题本身已经提供了足够的空间
本题属于后者,利用矩阵的第一行和第一列来作辅助空间使用
1.先确定第一行和第一列是否需要清零
即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。
2.扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0
这里不用担心会将本来第一行或第一列的1改成了0,因为这些值最后注定要成为0的。
3.根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了
即,拿第一行为例,如果扫描到一个0,就将这一列都清0.
4.根据1中确定的状态,处理第一行和第一列。
如果最开始得到的第一行中有0的话,就整行清零。同理对列进行处理。
1 public void setZeroes(int[][] matrix) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 if(matrix.length == 0){ 5 return; 6 } 7 int r = matrix.length; 8 int c = matrix[0].length; 9 10 boolean zeroRow = false, zeroCol = false; 11 for(int i = 0; i < c; i++){ 12 if(matrix[0][i] == 0){ 13 zeroRow = true; 14 break; 15 } 16 } 17 for(int i = 0; i < r; i++){ 18 if(matrix[i][0] == 0){ 19 zeroCol = true; 20 break; 21 } 22 } 23 24 for(int i = 1; i < r; i++){ 25 for(int j = 1; j < c; j++){ 26 if(matrix[i][j] == 0){ 27 matrix[i][0] = 0; 28 matrix[0][j] = 0; 29 } 30 } 31 } 32 33 for(int i = 1; i < r;i ++){ 34 for(int j = 1; j < c; j++){ 35 if(matrix[i][0] == 0 || matrix[0][j] == 0){ 36 matrix[i][j] = 0; 37 } 38 } 39 } 40 41 if(zeroRow){ 42 for(int i = 0; i < c; i++){ 43 matrix[0][i] = 0; 44 } 45 } 46 47 if(zeroCol){ 48 for(int i = 0; i < r; i++){ 49 matrix[i][0] = 0; 50 } 51 } 52 }