一.題目:
編寫(xiě)一種算法,若M × N矩陣中某個(gè)元素為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]]
二題解:
1.第一種解法:
(1)解題思路:
- 利用兩個(gè)HashSet表row_set,col_set存儲(chǔ)矩陣元素為0的橫縱坐標(biāo)
- 再根據(jù)橫坐標(biāo)row_set,將元素0所在行重置為0
- 再根據(jù)縱坐標(biāo)col_set,將元素0所在列重置為0
(2)具體實(shí)現(xiàn):
- 利用HashSet表記錄矩陣中元素為0的下標(biāo),其中row_set記錄元素0所在的行數(shù),col_set記錄元素0所在的列數(shù)
- 再利用for循環(huán),循環(huán)元素為int row_index,row_set將行數(shù)為row_set中成員所在行重置為0,Arrays.fill(matrix[row_index],0);
- 再利用嵌套for循環(huán),將0元素所在的列重置為0
- 外循環(huán)循環(huán)元素為 int col_index,col_set,內(nèi)循環(huán)為下標(biāo)為i,從0開(kāi)始遍歷,直到matrix.length-1
- 內(nèi)層循環(huán)下標(biāo)為i,從0開(kāi)始,遍歷到matrix[0].length-1,matrix[i][col_index]=0;
- 循環(huán)結(jié)束即轉(zhuǎn)換完畢
(3)代碼:
public static int[][] setZeros(int[][] matrix){
HashSet<Integer> row_set = new HashSet<Integer>();
HashSet<Integer> col_set = new HashSet<Integer>();
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==0){
row_set.add(i);
col_set.add(j);
}
}
}
for(int row_index:row_set){
Arrays.fill(matrix[row_index],0);
}
for(int col_index:col_set){
for(int i=0;i<matrix[0].length;i++){
matrix[i][col_index]=0;
}
}
return matrix;
}