編寫一個算法,若M*N矩陣中某個元素爲0,則將其所在的行與列清零。

       剛開始這個問題很簡單:直接遍歷整個矩陣,只要發現值爲0的元素,就將其所在的行與列清零。不過這種方法有個缺陷:在讀取被清零的行與列時,讀到的滿是零,因而所在的行與所在的列都變成了0,很快,整個矩陣都變成了0.算法

避開這個缺陷的方法之一是新建一個矩陣標記零元素的位置。而後,在第二遍遍歷矩陣的時候將0元素所在的行與列清零。這種作法的空間複雜度爲O(MN)數組

真的須要佔用O(MN)空間嗎?不是的,既然打算將整行和整列清零,所以並不須要標記錄它是cell[2][4](行2,列4),只須要知道行2有個元素爲0,列4有個元素爲0.無論怎樣,整行和整列都要清零,又何須要記錄零元素的確切位置?緩存

下面這個算法的實現代碼。這裏用兩個數組分別記錄包含零元素的所在行和列,而後,在第二遍遍歷矩陣時,若所在行或所在列標記爲0,則將元素清爲0索引

package cglib;內存


/**
 *  有一副由NxN矩陣表示的圖像,這裏每一個像素用一個int表示,請編寫一個算法,
 *  在不佔用額外內存空間的狀況下(即不使用緩存矩陣),
 *  將圖像順時針旋轉90度。
 *
 */class

public class StringNumber {
    public static int[][] setZeros(int[][] matrix){  
        boolean[] row = new boolean[matrix.length];  
        boolean[] column = new boolean[matrix[0].length];  
          
        //記錄值爲0的元素所在行索引和列索引  
        for(int i = 0;i<matrix.length;i++){  
            for(int j = 0;j<matrix[0].length;j++){  
                if(matrix[i][j] == 0){  
                    row[i] = true;  
                    column[j] = true;  
                }  
            }  
        }  
        //若行i或列j有個元素爲0,則將arr[i][j] 置爲0  
        for(int i = 0;i<matrix.length;i++){  
            for(int j = 0;j<matrix[0].length;j++){  
                if(row[i]|| column[j]){  
                    matrix[i][j] =0;  
                }  
            }  
        }
        return matrix;  
          
    }
        public static void main(String[] args) {
            int[][] matrix =new int[][]{{1,0,3},{4,5,0},{7,8,9}} ;
            int[][] qw=setZeros(matrix);
          
            for (int i=0;i<qw.length ;i++ )
            {
            for (int j=0;j<qw[i].length;j++ )
            {
            System.out.println(qw[i][j]+" ");
            }
            };
            
           
        }
    
}
      遍歷

相關文章
相關標籤/搜索