1. 程式人生 > >73. Set Matrix Zeroes 矩陣賦零

73. Set Matrix Zeroes 矩陣賦零

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

click to show follow up.

Follow up:

Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?

這道題我們可以通過不使用額外空間的方法完成,也就是使用矩陣的第一行和第一列儲存狀態,首先進行迴圈判斷第一行和第一列是否含有0,隨後對矩陣的每個元素進行迴圈,若果該元素為零則把該元素的第一行第一列都賦值為零,迴圈處理完矩陣中的每個元素後便對矩陣的第一行和第一列進行迴圈,如果第一行和第一列有元素為0則把對應的這一行或這一列都賦值為0,這裡需要注意這一步的迴圈必須跳過第一行和第一列自身,否則會出現矩陣中所有的元素都被賦值為0的情況,最後根據我們一開始儲存的矩陣第一行第一列是否含有0的狀態值判斷是否要把第一行和第一列全部賦值為0.

class Solution {
    public void
setZeroes(int[][] matrix) { boolean isFirstRow = false; // boolean isFirstColumn = false; // for(int i=0;i<matrix.length;i++){ if(matrix[i][0]==0){ isFirstRow = true; break; } } for(int i=0;i<matrix[0].length;i++){
if(matrix[0][i]==0){ isFirstColumn = true; break; } } for(int i=0;i<matrix.length;i++){ for(int j=0;j<matrix[0].length;j++){ if(matrix[i][j]==0){ matrix[i][0]=0; matrix[0][j]=0; } } } for(int i=1;i<matrix.length;i++){ if(matrix[i][0]==0){ for(int j=0;j<matrix[0].length;j++){ matrix[i][j]=0; } } } for(int i=1;i<matrix[0].length;i++){ if(matrix[0][i]==0){ for(int j=0;j<matrix.length;j++){ matrix[j][i]=0; } } } if(isFirstRow){ for(int i=0;i<matrix.length;i++){ matrix[i][0]=0; } } if(isFirstColumn){ for(int i=0;i<matrix[0].length;i++){ matrix[0][i]=0; } } } }