LeetCodeマトリックスゼロ化
@author:Jingdai
@date:2020.09.30
トピックの説明(73の質問)
m x n行列が与えられ、要素が0の場合、その行と列のすべての要素を0に設定します。インプレースアルゴリズムを使用してください。
- 入力例:
[ [1,1,1], [1,0,1], [1,1,1] ]
- サンプル出力:
[ [1,0,1], [0,0,0], [1,0,1] ]
アイデア
トピックを参照してください。最初に考えたのは、記録された2セットの行を使用し、トラバース時に0に設定する必要がある列を、0に
matrix[i][j]
等しい場合はコレクション行i
に追加し、列のセットを追加することj
です。if (matrix[i][j] == 0) { rowSet.add(i); columnSet.add(j); }
次に、配列を再度トラバースし、対応する行と列の要素を0に設定します。つまり、次のようになります。
if (rowSet.contains(i) || columnSet.contains(j)) { matrix[i][j] = 0; }
この方法は比較的直感的で理解しやすいですが、余分な
(m+n)
サイズのスペースが必要です。これは、一定サイズのスペースのみを使用する別の方法です。上記の方法では、どの行とどの列を0に設定する必要があるかを記録する必要があります。次の図に示すように、マトリックスの0行目と0列目の要素を使用して記録できます。
matrix[1][1]
0に等しい場合、それは対応する行matrix[1][0]
の最初の要素になり、対応する列matrix[0][1]
の最初の要素は0に設定されます。最初の要素は、判断後に対応する行と列が0に設定されても影響しないことに注意してください。 、エルゴードマトリックスをmatrix[i][j]
永遠に見つけて後ろmatrix[0][j]
からmatrix[i][0]
判断するので影響はありません。マトリックス全体をトラバースした後、マトリックスを再度トラバースし、行0の0要素に対応するすべての列を0に設定し、列0の0要素に対応するすべての行を0に設定します。これで終わりのようですが、実際には問題があります。下の写真を見てください。
要素が0行目に位置したときに示されるように0列0、又は、
matrix[1][0]
とmatrix[0][1]
なりますがmatrix[0][0]
0になり、決意は0ではない第1の要素の行は、我々が0の要素があるかどうかの余分な可変レコードを必要とするので、0 0 0の要素であります行0と列0。ここでは、多
boolean
変数を設定しisRow
、0行目を横断するゼロライン0要素かどうかを記録しmatrix
ます。最初の行に0が含まれている場合、0の値は変更せず、前に他の行にisRow
設定されますtrue
が、最後の行の場合はmatrix[0][0]
値は0であり、それは以下によれば、第1の変形例は、第0行0番目の列を変更しない第2のパス、最初の列は0(0又は自体が0である自体)が含まれ確かにisRow
とmatrix[0][0]
行0と列0を別々に更新する値。コードは以下のように表示されます。
コード
public void setZeroes(int[][] matrix) { if (matrix.length == 0) { return; } boolean isRow = false; int row = matrix.length; int column = matrix[0].length; for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { if (i == 0) { if (matrix[i][j] == 0) { isRow = true; } } else { if (matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 0; } } } } for (int i = 1; i < row; i++) { for (int j = 1; j < column; j++) { if (matrix[i][0] == 0 || matrix[0][j] == 0) { matrix[i][j] = 0; } } } if (matrix[0][0] == 0) { for (int i = 1; i < row; i++) { matrix[i][0] = 0; } } if (isRow) { for (int j = 0; j < column; j++) { matrix[0][j] = 0; } } }