1. 程式人生 > >給定一個m×n矩陣,如果一個元素為0,則將其整行和列的值設定為0.

給定一個m×n矩陣,如果一個元素為0,則將其整行和列的值設定為0.

本題源自LeetCode

--------------------------------------------------

思路1  遍歷整個陣列,遇到0  就把整行和整列不為0 的值置為* ,然後再次遍歷陣列把* 換為0

 void setZeroes(vector<vector<int> > &matrix) {
        int rows=matrix.size();
        int cols=0;
        if(rows!=0){
            cols=matrix[0].size();
        }
        if(rows==0||cols==0)
            return;
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                if(matrix[i][j]==0){
                   for(int k=0;k<cols;k++){
                       if(matrix[i][k]!=0){   //跳過該行中其他值為0 的元素
                       //if(k!=j){
                           matrix[i][k]='*';
                       }
                   }
                   for(int k=0;k<rows;k++){
                       if(matrix[k][j]!=0){
                           matrix[k][j]='*';
                       }
                   } 
                    
                }
            }
        }
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                if(matrix[i][j]=='*'){
                    matrix[i][j]=0;
                }
            }
        }
    }

思路2 :

用第一行和第一列儲存陣列中0的行和列

    void setZeroes(vector<vector<int> > &matrix) {
        int rows=matrix.size();
        int cols=0;
        if(rows!=0){
            cols=matrix[0].size();
        }
        if(rows==0||cols==0)
            return;
        int rowFlag=false;
        int colFlag=false; 
        //判斷第一行和第一列是否有 0 
        for(int i=0;i<rows;i++){
            if(matrix[i][0]==0)
                colFlag=true;
        }
        for(int i=0;i<cols;i++){
            if(matrix[0][i]==0)
                rowFlag=true;
        }
        
        for(int i=1;i<rows;i++){
            for(int j=1;j<cols;j++){
        		if(matrix[i][j]==0){
                    matrix[0][j]=0;   //用第一行和第一列記錄 0 的行和列
                    matrix[i][0]=0;
                }        
            }
        }
        for(int i=1;i<rows;i++){
            for(int j=1;j<cols;j++){
                if(matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }
        //最後處理第一行
        if(rowFlag){
            for(int i=0;i<cols;i++){
                matrix[0][i]=0;
            }
        }
        if(colFlag){
            for(int i=0;i<rows;i++){
                matrix[i][0]=0;
            }
        }
    }