给定两个数组,编写一个函数来计算它们的交集。golang
示例 1:数组
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:app
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4]
说明:函数
输出结果中的每一个元素必定是惟一的。
咱们能够不考虑输出结果的顺序。优化
能够发现,貌似用数组作哈希表能够解决这道题目,把nums1的元素,映射到哈希数组的下表上,而后在遍历nums2的时候,判断是否出现过就能够了。可是题目并无说明限制数组数值大小,若是哈希值比较少、特别分散、跨度很是大,使用数组就形成空间的极大浪费。不像前面的两道题,数组存储英文的26个字母,是固定且个数较少,比较适合采用数组。code
所以这题咱们采用set集合,注意,在golang中是没有set类型的,咱们能够采用map类型代替,用map的key做为惟一值并进行去重。例如输入:nums1 = [1,2,2,1], nums2 = [2,2],利用map[int]bool存储nums1就变成了mp={1:true,2:true},能够节省一部分空间。此时再遍历num2中的元素,若是有交集的元素则存入result结果集就好。内存
具体代码以下:io
func intersection(nums1 []int, nums2 []int) []int { mp := make(map[int]bool) result := make([]int, 0) //存放交集元素 for _, n1 := range nums1 { //将nums1中的数做为mp中的键,实现去重效果 mp[n1] = true } for _, n2 := range nums2 { if mp[n2] { mp[n2] = false result = append(result, n2) } } return result }
这里能够作个空间优化:map的value值是布尔型,这会致使set多占用内存空间,解决这个问题,则能够将其替换为空结构。在Go中,空结构一般不使用任何内存。即unsafe.Sizeof(struct{}{}) 的结果为 0。class
func intersection(nums1 []int, nums2 []int) []int { mp := make(map[int]struct{}) result := make([]int, 0) for _, n1 := range nums1 { //将nums1中的数做为mp中的键,实现去重效果 mp[n1] = struct{}{} } for _, n2 := range nums2 { if _, ok := mp[n2]; ok { result = append(result, n2) delete(mp, n2) } } return result }