与えられた2つの配列が、その交点を計算する関数を記述します。
例1:
入力:nums1 = [1,2,2,1]、nums2 = [2,2] 出力:[2,2]
例2:
入力:nums1 = [4,9,5]、nums2 = [9,4,9,8,4] 出力:[4,9]
注意:
- それが両方の配列に示すように、結果の各要素は、何回も表示されます。
- 結果は、任意の順序にすることができます。
十分ではないアプローチ
VaRの交差= 関数(nums1、nums2){ せR = []; // 大きな配列を取得 LEN1 =一定nums1.lengthを。 constのLEN2 = nums2.length。 // 大きな&小さい より大きい= LEN1> LEN2 constの?nums1:nums2。 小さいCONST = LEN1> LEN2?nums2:nums1。 // オブジェクトにCONVER大きなアレイは =ハッシュ聞かせ{}。 用{(Nより大きいとせ) 場合(N におけるハッシュ){ ハッシュ[N] ++ ; }他{ ハッシュ[N] = 1 。 } } // 小さいアレイ上のループ のための(Nより小さいとせ){ 場合( `$ {N}` におけるハッシュ){ r.push(N) ハッシュ[N] =ハッシュ[N] -1 。 もし(ハッシュ[N] === 0 ){ 削除ハッシュ[N]。 } } } 戻りR。 }。
上記のコードは十分良いではないことの理由は、ためです\
1.私たちは、ルックアップ、この原因の多くのメモリの使用量として、より大きな配列を使用します。 - 実際に、私たちは、ルックアップとして小さな配列を使用する必要があります
2.私たちは「LEN1、LEN2、samller、より大きな」余分なストレージを使用して、私たちすることができますactullyスワップnums1と1つの余分の関数呼び出しによってNUMS。
VaRの交差= 関数(nums1、nums2){ 場合(nums1.length> nums2.length){ 戻り交差(nums2、nums1)。 } // CONVERオブジェクトに配列がsamller =ハッシュ聞かせ{}。 用{(N nums2のせて) 場合(N におけるハッシュ){ ハッシュ[N] ++ ; } 他{ ハッシュ[N] = 1 。 } } せR = []; // 小さいアレイ全体のループ のために(N nums1のせ){ 場合(ハッシュ[N]> 0 ){ r.push(N) ハッシュ[N] =ハッシュ[N] -1 。 } } 戻りR。 }
ファローアップ:
- 指定された配列は、すでに何をしてソートされている場合?どのようにあなたのアルゴリズムを最適化するのでしょうか?
- どのような場合 nums1の大きさは、と比較して小さい nums2 Sサイズ'?どちらのアルゴリズムが良いですか?
- 要素をどのような場合 nums2は、 ディスク上に格納され、メモリが一度にメモリにすべての要素を読み込むことができないように制限されますか?
質問フォローアップのための別の記事を書きます。