矩陣置零
阿新 • • 發佈:2018-07-15
輸出 com bre 使用 break target baidu div 示例
給定一個 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] ]
一開始我想的是找到所有帶0的行和列 放到row[m]和col[n]裏,這樣需要m+n的額外空間。
後來看了別人的解後 發現可以把第一行第一列當做上面的row[m]和col[n]來用,當然這就需要先記錄下首行首列是否要置0,這樣只需要2個int的額外空間。
下面是是代碼,寫得比較散,但是便於理解,以後可以把它們合並起來。
void setZeroes(int** matrix, int matrixRowSize, int matrixColSize) { if(matrixRowSize==0||matrixColSize==0) return; int m=matrixRowSize; int n=matrixColSize; int i,j; int firstRow=0; int firstCol=0; for(i=0;i<m;i++) if(matrix[i][0]==0) { firstCol=1; break; } for(j=0;j<n;j++) if(matrix[0][j]==0) { firstRow=1; break; } for(i=1;i<m;i++) { for(j=1;j<n;j++) if(matrix[i][j]==0) { matrix[0][j]=0; matrix[i][0]=0; } } for(i=1;i<m;i++) { if(matrix[i][0]==0) { for(j=1;j<n;j++) matrix[i][j]=0; } } for(j=1;j<n;j++) { if(matrix[0][j]==0) { for(i=1;i<m;i++) matrix[i][j]=0; } } if(firstRow) { for(j=0;j<n;j++) matrix[0][j]=0; } if(firstCol) { for(i=0;i<m;i++) matrix[i][0]=0; } }
矩陣置零