349 两个数组的交集-中等

题目:

给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

分析:

哈希表存储,如果存在第一个数组中,值为1,如果存在第二个数组,值为2。

最后遍历哈希表即可。

// date 2023/12/05
func intersection(nums1 []int, nums2 []int) []int {
    set := make(map[int]int, 32)
    for _, v := range nums1 {
        _, ok := set[v]
        if !ok {
            set[v] = 1
        }
    }
    for _, v := range nums2 {
        _, ok := set[v]
        if ok {
            set[v] = 2
        }
    }
    res := make([]int, 0, 4)
    for k, v := range set {
        if v == 2 {
            res = append(res, k)
        }
    }
    return res
}

思考:如果是已经排序的数组,如何求交集。

如果是有序数组,直接在另一个数组中二分查找。算法如下:

// date 2023/12/05
func intersection(nums1 []int, nums2 []int) []int {
    res := make([]int, 0, 16)
    sort.Slice(nums1, func(i, j int) bool {
        return nums1[i] < nums1[j]
    })
    sort.Slice(nums2, func(i, j int) bool {
        return nums2[i] < nums2[j]
    })

    for i := 0; i < len(nums1); i++ {
        if i > 0 && nums1[i] == nums1[i-1] {
            continue
        }
        if findEqual(nums2, nums1[i]) {
            res = append(res, nums1[i])
        }
    }

    return res
}

func findEqual(nums []int, key int) bool {
    n := len(nums)

    if nums[0] > key || nums[n-1] < key {
        return false
    }

    left, right := 0, n-1
    for left <= right {
        mid := (left + right) / 2
        if nums[mid] == key {
            return true
        } else if nums[mid] < key {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return false
}

最后更新于