🚀

LeetCode 2215. Find the Difference of Two Arrays - ハッシュセットへの変換

に公開

2215. Find the Difference of Two Arrays

https://leetcode.com/problems/find-the-difference-of-two-arrays/description

Intution

  • nums1とnums2の重複がある場合に削除して、それぞれ新しい配列を作るようにする
    • 共通配列を作って差分をとればいいのではないか。

ruby

  def find_difference(nums1, nums2)
    c = nums1 & nums2
    [(nums1 - c).uniq, (nums2 - c).uniq]
end

こちらのSolutionがより簡単でした。共通配列を作る一手が不要となる。
https://leetcode.com/problems/find-the-difference-of-two-arrays/solutions/3029175/ruby-from-junior-one-liner/

def find_difference(nums1, nums2)
    [(nums1 - nums2).uniq, (nums2 - nums1).uniq]
end

python

class Solution:
    def findDifference(self, nums1: List[int], nums2: List[int]) -> List[List[int]]:
        ans1 = []
        ans2 = []
        for n1 in nums1:
            if n1 not in nums2:
                ans1.append(n1)

        for n2 in nums2:
            if n2 not in nums1:
                ans2.append(n2)

        return list(set(ans1)), list(set(ans2))
  • for n1 in nums1: のループ内で if n1 not in nums2: のチェックを行っています。このnot in演算子は、リストに対して使うと、最悪の場合でリストの長さ分の時間がかかります。つまり、O(n)の計算量。

Approach

ハッシュセットを利用する。

class Solution:
    def findDifference(self, nums1: List[int], nums2: List[int]) -> List[List[int]]:
        set1 = set(nums1)
        set2 = set(nums2)

        return list(set1-set2), list(set2-set1)

typescript

Setの差集合は提供されていないため、filter()has()で差集合を計算する。

function findDifference(nums1: number[], nums2: number[]): number[][] {
    const set1 = new Set<number>(nums1)
    const set2 = new Set<number>(nums2)

    return [
        [...set1].filter(x => !set2.has(x)),
        [...set2].filter(x => !set1.has(x))
    ]
};

golang

func findDifference(nums1 []int, nums2 []int) [][]int {
    set1 := map[int]bool{}
    set2 := map[int]bool{}
    for _, n := range nums1 {
        set1[n] = true
    }
    for _, n := range nums2 {
        set2[n] = true
    }

    diff1, diff2 := []int{}, []int{}
    for k := range set1 {
        if !set2[k] {
            diff1 = append(diff1, k)
        }
    }
    for k := range set2 {
        if !set1[k] {
            diff2 = append(diff2, k)
        }
    }

    return [][]int{diff1, diff2}
}
  • 重複排除: リストからハッシュセットを作成する際に、重複する要素は自動的に上書きされるため、一意な要素の集合を取得。
  • 要素の存在チェック: ハッシュセットでの存在チェックは、平均してO(1)で完了。これに対し、リストでのチェックは線形探索になり、O(n)かかる。

学習のポイント

  • ハッシュセットの存在チェックはO(1)で完了する。

Discussion