给定两个数组,编写一个函数来计算它们的交集。
示例 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
}