LeetCode-73-Set Matrix Zeros
阿新 • • 發佈:2018-12-18
給定一個 m x n 的矩陣,如果一個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。
示例 1:
輸入: [ [1,1,1], [1,0,1], [1,1,1] ] 輸出: [ [1,0,1], [0,0,0], [1,0,1] ]
【思路】
原地演算法,即使用O(1)的額外空間。看到題目之後可以確定幾點約束:
1. 在迴圈中如果直接修改原矩陣,將會導致matrix出現一些原來沒有的0.如何控制這種情況?
2. 要求O(1)的額外空間,我們不能使用儲存整個矩陣的O(mn)的方法,也不能使用儲存為0行和為0列的O(m+n)方法。
解法: 受了一位blog大佬的啟發—— 連結
1. 首先找一行不存在0的一行,如果沒有找到就把所以元素置0.
2. 找到了flag_row之後,我們先做行操作,把有0的行置0,但是這樣會使得我們後面無法得知哪些列是原矩陣存在0的。因此我們先把列是否存在0的資訊儲存在flag_row,因為flag_row的原始資料是不存在0的,而現在有0的位置表示這一列是原來存在0的。而後我們做行操作,將存在0的行都置0。
3. 進行列操作,因為我們在第二步中已經存了原始列是否有0的資訊,如果flag_row中元素為0則把這一列置0,完成之後,演算法完成,。
【程式碼】
public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; int flag_row = 0; boolean find_flag = false; boolean row_find_zeros = false; for (int i = 0; i < m; i++){ row_find_zeros = false; for(int j = 0; j < n; j++){ if (matrix[i][j] == 0){ row_find_zeros = true; break; } } if(row_find_zeros == false){ flag_row = i; find_flag = true; break; } } if(find_flag == false){ for (int i = 0; i < m; i++) for(int j = 0; j < n; j++) matrix[i][j] = 0; return; } // 找到了第一行全不為0的行,按照列是否有9將標記列對應列至0 for(int j = 0; j < n; j++) for(int i = 0; i < m; i++){ if (matrix[i][j] == 0){ matrix[flag_row][j] = 0; break; } } //行掃描,除標記行,其餘行按照行規則置0 for(int i = 0; i < m; i++) for(int j = 0; j < n; j++){ if (i == flag_row) break; else{ if(matrix[i][j] == 0){ for(int s = 0; s < n; s++) matrix[i][s] = 0; break; } } } //掃描標記列,按照列規則置0 for(int j = 0; j < n; j++){ if(matrix[flag_row][j] == 0) for(int i = 0; i < m; i++) matrix[i][j] = 0; } }