1. 程式人生 > >LeetCode-73-Set Matrix Zeros

LeetCode-73-Set Matrix Zeros

給定一個 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;
        }
  }