1. 問題の説明
leetcode の問題を処理するとき、最初に次のコードを使用して 2 次元配列を作成しました。
let arr = new Array(m).fill(new Array(n).fill(0))
印刷された結果に問題はありませんが、要素に値を割り当てて、一部のテスト ケースがパスできないことを確認する必要があります. 最終的に生成された arr を印刷した後、多くの要素が複数回インクリメントされていることがわかりました.
2. 原因分析
上記のメソッドは、n 要素を含む配列への参照を作成し、この配列の各要素は 0 で埋められます。fill メソッドがこの配列を外側の配列に埋めるとき、配列への参照を各場所にコピーするだけです。これは、要素を変更すると、すべての行が同じ内部配列参照を共有するため、この変更がすべての行に反映されることを意味します。
3.解決する
- 次のように 2 次元配列を作成します。
let arr = new Array(m).fill(0).map(() => new Array(n).fill(0))
このアプローチでは、fill と map の 2 つの演算子を使用します。最初に、new Array(m) は、それぞれ未定義の m 個の要素を持つ新しい配列を作成します。各要素は、fill(0) を使用して 0 で埋められます。次に、 map(() => new Array(n).fill(0)) を使用して、配列の各要素を n 個の要素 (それぞれが 0) の新しい配列にマップします。このようにして、m 行 n 列の 2 次元配列が得られます。