leetcode73_矩陣置零
阿新 • • 發佈:2018-12-10
給定一個 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; } }