剛開始這個問題很簡單:直接遍歷整個矩陣,只要發現值爲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]+" ");
}
};
}
}
遍歷