1. 程式人生 > >leetcode73_矩陣置零

leetcode73_矩陣置零

給定一個 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(m+n)的時間複雜度
	 public void setZeroes1(int[][] matrix) {
		    int m = matrix.length;
	        int n = matrix[0].length;
	        boolean[] rawFlags = new boolean[m];  //標記該行有0
	        boolean[] colFlags = new boolean[n];  //標記該列有0
	        for (int i = 0; i < m; i++) {
	            for (int j = 0; j < n; j++) {
	                if (matrix[i][j] == 0) {
	                    rawFlags[i] = true;
	                    colFlags[j] = true;
	                }
	            }
	        }
	        // 調整每一行置0
	        for (int i = 0; i < m; i++) {
	            if (rawFlags[i]) {
	                for (int j = 0; j < n; j++) {
	                    matrix[i][j] = 0;
	                }
	            }
	        }
	        // 調整每一列置0
	        for (int i = 0; i < n; i++) {
	            if (colFlags[i]) {
	                for (int j = 0; j < m; j++) {
	                    matrix[j][i] = 0;
	                }
	            }
	        }     
    }

使用常數空間的解法

     //O(1)空間複雜度 用每一行的第一列作為標記
	 public void setZeroes(int[][] matrix) {
		 int col0 = 1;      //記錄第一列 
		 int m = matrix.length, n = matrix[0].length;

	        for (int i = 0; i < m; i++) {
	            if (matrix[i][0] == 0) col0 = 0;  //標記第一列是否為0
	            for (int j = 1; j < n; j++)       //從第二列開始
	                if (matrix[i][j] == 0)
	                    matrix[i][0] = matrix[0][j] = 0;
	        }

	        for (int i = m - 1; i >= 0; i--) {
	            for (int j = n - 1; j >= 1; j--)  {   //判斷到第二列
	                if (matrix[i][0] == 0 || matrix[0][j] == 0)
	                    matrix[i][j] = 0;
	            }
	            if (col0 == 0) matrix[i][0] = 0;
	        }
	 }