标签:
原题链接在这里:https://leetcode.com/problems/set-matrix-zeroes/
最原始的想法就是复制一个matrix, 扫描复制的matrix, 若遇到0, 更改原来的matrix, 如此使用O(m*n) space.
观察到判断一个数是否应该更改为0 只需要看它的同行同列是否有0就好,所以可以优化成只使用两个 boolean array, 一个记录所有行, 一个记录所有列 是否有0即可, 如此使用O(m+n) space.
更好的方法是使用第一行 和 第一列 来代替额上面的两个记录array, 那么第一行和第一列本来是否需要改成0 呢,其实只需要两个boolean value: firstRow, firstCol 来记录就好,如此只需要使用O(1) space.
Time Complexity is always O(m*n).
AC Java:
1 public class Solution { 2 public void setZeroes(int[][] matrix) { 3 if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ 4 return; 5 } 6 //Record if first row, first columna contains 0 7 boolean firstRow = false; 8 boolean firstCol = false; 9 for(int i = 0; i<matrix.length; i++){ 10 if(matrix[i][0] == 0){ 11 firstCol = true; 12 break; 13 } 14 } 15 for(int j = 0; j<matrix[0].length; j++){ 16 if(matrix[0][j] == 0){ 17 firstRow = true; 18 break; 19 } 20 } 21 22 //for the rest of the matrix, if there are 0, mark its corresponding row and columna as 0 at first column and first row 23 for(int i = 1; i<matrix.length; i++){ 24 for(int j = 1; j<matrix[0].length;j++){ 25 if(matrix[i][j] == 0){ 26 matrix[i][0] = 0; 27 matrix[0][j] = 0; 28 } 29 } 30 } 31 32 //Scan the matrix for the second time, if corresponding mark is 0, change this element to 0 33 for(int i = 1; i<matrix.length; i++){ 34 for(int j = 1; j<matrix[0].length; j++){ 35 if(matrix[i][0] == 0 || matrix[0][j] == 0){ 36 matrix[i][j] = 0; 37 } 38 } 39 } 40 41 //Change first row and columna at last 42 if(firstRow){ 43 for(int j = 0; j<matrix[0].length; j++){ 44 matrix[0][j] = 0; 45 } 46 } 47 if(firstCol){ 48 for(int i = 0; i<matrix.length; i++){ 49 matrix[i][0] = 0; 50 } 51 } 52 } 53 }
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4868741.html