解法一:(使用兩個標記變量)用矩陣的第一行和第一列代替方法一中的兩個標記數組(col、row[ ]:第幾列、行出現0),以達到 O(1) 的額外空間。
- 這樣會導致原數組的第一行和第一列被修改,無法記錄它們是否原本包含 0。因此我們需要額外使用兩個標記變量分別記錄第一行和第一列是否原本包含 0。
- 在實際代碼中,我們首先預處理出兩個標記變量,接著使用其他行與列去處理第一行與第一列,然后反過來使用第一行與第一列去更新其他行與列,最后使用兩個標記變量更新第一行與第一列即可。
class Solution {public void setZeroes(int[][] matrix) {int m=matrix.length, n=matrix[0].length;boolean row=false, col=false;for(int i=0; i<n; i++){if(matrix[0][i]==0){row=true;}}for(int i=0; i<m; i++){if(matrix[i][0]==0){col=true;}}for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(matrix[i][j]==0){matrix[0][j]=0;matrix[i][0]=0;}}}for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(matrix[i][0]==0 || matrix[0][j]==0){matrix[i][j]=0; }}}if(row){for(int i=0;i<n;i++){matrix[0][i]=0;}}if(col){for(int i=0;i<m;i++){matrix[i][0]=0;}}}
}
注意:
- 同時涉及到ij時,ij都是從1開始 -> 只處理除了第一行和第一列的數
- 只要matrix[i][0]==0或者matrix[0][j]==0,則matrix[i][j]==0