0350-leetcode算法实现之两个数组的交集II-intersectionofTwoArrays-python&golang实现

给定两个数组,编写一个函数来计算它们的交集。

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。

链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii

python

## 哈希表,也适用于另一个数组很大,存在磁盘这种情况。遍历一个数组计数数值出现次数,遍历另外的数组,只要数值存在于哈希表且对应的value > 0 ,将结果加入返回结果中

## 效率:时间O(m+n), 空间借助哈希表,最坏O(n)
class Solution:
    def intersectionII(self, nums1: [int], nums2: [int]) -> [int]:
        from collections import defaultdict
        m = defaultdict(int)
        res = list()
        for i in range(len(nums1)):
            m[nums1[i]] += 1

        for i in range(len(nums2)):
            if nums2[i] in m and m[nums2[i]] > 0:
                res.append(nums2[i])
                m[nums2[i]] -= 1
        return res
    # 排序加双指针 时间O(nlogn), 空间O(n)
    def intersectionII1(self, nums1: [int], nums2: [int]) -> [int]:
        nums1.sort()
        nums2.sort()
        p1, p2 = 0, 0
        len1, len2 = len(nums1), len(nums2)
        res = list()
        while p1 < len1 and p2 < len2:
            num1, num2 = nums1[p1], nums2[p2]
            if num1 == num2:
                res.append(num1)
                p1 += 1
                p2 += 1
            elif num1 > num2:
                p2 += 1
            else:
                p1 += 1
        return res

if __name__ == "__main__":
    nums1 = [1,2,2,2,2,2,4,7,5,3,6,12,6,7,5]
    nums2 = [5,13,15,9,8,2,3,4,2,5,5,4]
    test = Solution()
    print(test.intersectionII(nums1, nums2))
    print(test.intersectionII1(nums1, nums2))

golang

package main

import (
	"fmt"
	"sort"
)

func main() {
	var nums1 = []int{1, 1, 1, 1, 1, 3, 4, 5, 8, 5, 6, 3, 3}
	var nums2 = []int{1, 1, 3, 4, 5, 8, 5, 19, 3}
	res := intersectionII(nums1, nums2)
	fmt.Println(res)
	res1 := intersectionII1(nums1, nums2)
	fmt.Println(res1)
}

func intersectionII(nums1 []int, nums2 []int) []int {
	if len(nums1) > len(nums2) {
		return intersectionII(nums2, nums1)
	}

	m := map[int]int{}
	for _, v := range nums1 {
		m[v]++
	}
	intersection := []int{}
	for _, v := range nums2 {
		if m[v] > 0 {
			intersection = append(intersection, v)
			m[v]--
		}
	}
	return intersection
}

// 排序加双指针
func intersectionII1(nums1 []int, nums2 []int) []int {
	sort.Ints(nums1)
	sort.Ints(nums2)
	len1, len2 := len(nums1), len(nums2)
	p1, p2 := 0, 0

	intersection := []int{}

	for p1 < len1 && p2 < len2 {
		if nums1[p1] == nums2[p2] {
			intersection = append(intersection, nums1[p1])
                        p1++
                        p2++
		} else if nums1[p1] < nums2[p2] {
			p1++
		} else {
			p2++
		}
	}
	return intersection
}

posted on 2021-10-13 14:59  进击的davis  阅读(48)  评论(0)    收藏  举报

导航