LeetCodeマトリックスゼロ化(73の質問)

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である自体)が含まれ確かにisRowmatrix[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;
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_41512783/article/details/108880824