これはインタビューの質問です: サイズ mxn の 2 次元配列で、値がゼロの各要素について、この要素が配置されている行と列全体をゼロに設定し、残りの要素はそのままにしておきます。
私が思いついた方法は、配列内の各要素を繰り返し処理することでした。ゼロに遭遇するたびに、行と列全体をゼロでマークします。しかし、これは素朴です。改善を提案してください。
これはインタビューの質問です: サイズ mxn の 2 次元配列で、値がゼロの各要素について、この要素が配置されている行と列全体をゼロに設定し、残りの要素はそのままにしておきます。
私が思いついた方法は、配列内の各要素を繰り返し処理することでした。ゼロに遭遇するたびに、行と列全体をゼロでマークします。しかし、これは素朴です。改善を提案してください。
余分なスペースが許可されている場合。フラグの 2 つの配列を維持するだけです。
1 つは行を表し、もう 1 つは列を表します。すべてのデフォルト値は 1 に設定されています。
元の行列をスキャンして、行 x と列 y に 0 があると仮定します。行[x] = 0を設定するだけです。列[y] = 0;
次に、マトリックスを再度スキャンします
for ( int i = 0; i < height; ++i )
for ( int j = 0; j < width; ++j )
M[i][j] = M[i][j] * row[i] * column[j];
次に、行列 M を変更します
進むにつれてゼロにすると、最初に見つけた行と列の後にすべての行と列がクリアされます。行と列をゼロにする前に、すべてのゼロを見つけて記録するだけです。または、2 次元配列のコピーを作成し、1 番目の配列を参照しながら 2 番目の配列を変更します。
余分なスペースは許可されていますか? その場合、mxn 行列が与えられた場合、行をいつゼロにするかを示すために、行のサイズが m の 2 つのビットマップを維持し、列についても同様に維持します。ビットマップを使用すると、行または列が既に設定されているかどうかを O(1) で簡単に確認できます。
パス 1: マトリックスの最適化された反復。マトリックスの要素を反復しながらゼロを探します。ゼロが位置 (i,j) であることがわかった場合、2 つのビット マップに対応するビットを設定し、その行の反復を停止できます。さらなる要素。(結局のところ、行と列全体をゼロにしています)。
パス 2: これで 2 つのビット マップが得られました。これらをループして、行と列をゼロにします。行内の要素をゼロ化するときに非常に最適化したい場合 (ゼロ化がコストのかかる操作である場合)、対応する列ビットが設定されている場合はスキップできます。
編集:ゼロを見つけた場合はマトリックスを反復処理しながら、列だけのビットマップを持つだけで1回のパスでそれを行うことができ、その行と列全体をゼロに設定し、列のビットマップ位置を設定し、次の行に進みます. 後続の行を繰り返しながら、ビットが設定された列をスキップします
package helloWorld;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public static int[][] myFunction(int[][] matrix) {
// find all rows and columns that contains zeros
// keep their indexes in hashMap
// loop over the matrix and check if you have row and column in your
// hashmap if yes make them zero, and also mark the row/column as
// already zeroed
Map<String, Boolean> map = new HashMap<String, Boolean>();
int length = matrix[0].length;
int heigth = matrix.length;
for (int i = 0; i < heigth; i++) {
for (int j = 0; j < length; j++) {
if (matrix[i][j] == 0) {
// mark and keep Row in Map
if (!map.containsKey("R" + i)) {
map.put("R" + i, false);
}
// mark and keep column in Map
if (!map.containsKey("C" + j)) {
map.put("C" + j, false);
}
}
}
}
for (int i = 0; i < length; i++) {
//check if row need to be zeroed and if yes zero it and Mark it
//as done
if (map.containsKey("R" + i) && !map.get("R" + i)) {
for (int j = 0; j < length; j++) {
matrix[i][j] = 0;
}
map.put("R" + i, true);
}
//check if column need to be zeroed and if yes zero it and Mark
//it as done
if (map.containsKey("C" + i) && !map.get("C" + i)) {
for (int j = 0; j < heigth; j++) {
matrix[j][i] = 0;
}
map.put("C" + i, true);
}
}
return matrix;
}
public static void main(String[] args) {
int[][] matrix = { { 1, 2, 0, 7, 6 }, { 1, 0, 8, 7, 5 }, { 1, 2, 1,
7,-1 }, { 1, 2, 3, 4, 0 } };
print(matrix);
System.out.println("#####################################");
matrix=myFunction(matrix);
print(matrix);
}
public static void print(int[][] matrix) {
int h = matrix.length;
int l = matrix[0].length;
for (int i = 0; i < h; i++) {
for (int j = 0; j < l; j++) {
System.out.print(" " + matrix[i][j] + " ");
}
System.out.println();
}
}
}