1. 程式人生 > >leetcode 73. 矩陣置零-Set Matrix Zeroes

leetcode 73. 矩陣置零-Set Matrix Zeroes

題目描述:

給定一個 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(1),解釋見程式碼部分

程式碼:

class Solution {
    public void setZeroes(int[][] matrix) {
        int row=matrix.length;
        int col=matrix[0].length;
        
        /*記錄第1列中是否有0,如果有0,第一列應該全賦值為0
        (賦值為0的操作在54行程式碼會進行),這裡只進行記錄。*/
        boolean first_col_has_zero=false;
        for(int i=0;i<row;i++){
            if(matrix[i][0]==0){
                first_col_has_zero=true;
            }
            for(int j=1;j<col;j++){//從每行第2列開始,因為第1列用來做標誌位
                if(matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        
        /*處理matrix[1][1]到matrix[row-1][col-1]之間的元素,該賦0的賦0:
          {matrix[1][1]......................................
           matrix[2][1]......................................             
           ..................................................
           .................................................. 

           ........... ..................matrix[row-1][col-1]}
         */
                                                    
        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                if(matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }
        
        
        /*matrix[0][0]==0有兩種情況:
            第一種是遍歷了第一行元素matrix[0][1]~matrix[0][col],如果其中有元素等於0,
        則matrix[0][0]被賦值為0;
            還有一種情況就是matrix[0][0]本身就是0。
            不管哪種情況,最後第一行元素都要賦值為0,所以有以下語句
        */
        if(matrix[0][0]==0){
            for(int j=1;j<col;j++){
                matrix[0][j]=0;
            }
        }
        /*
            first_col_has_zero為true說明第一列中matrix[0][0]~matrix[row][0]有元素為0,
        不管那個元素為零,第一列都要被賦值為0。
            值得注意的是,這裡的0是未修改前的0,因為第一行和第一列作為matrix[i][j]的標誌位,
        所以第一行第一列會根據matrix[i][j]是否為0來決定是否修改為0
        */
               
        if(first_col_has_zero){
            for(int i=0;i<row;i++){
                matrix[i][0]=0;
            }
        }
        
    }
}