1. 程式人生 > >矩陣置零

矩陣置零

輸出 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; } }

矩陣置零