给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
思考:如果两个数组都是排好序的呢?
来源:力扣(LeetCode)
思路:因为是求两个数组的交集,所以只需要循环其中一个数组判断每个元素是否在另外一个数组中出现,常规做法是两层循环,但是这样时间复杂度就上去了,如何减少时间复杂度呢?我们将其中一个数组的元素作为key,这个元素在数组中出现的次数作为值,这样我们用另外一个数组的元素作为key去map中取值,如果大于0说明,该key就是两个数组的重复元素,同时把该值置为零,防止重复元素(如果要求重复的也加入到新数组,只需要将该值-1)。
代码:
func intersection(nums1 []int, nums2 []int) []int {
m:=make(map[int]int,0)
for _,v:=range nums1{
m[v]+=1
}
count:=0 //记录新数组长度
for _,v:=range nums2{
if m[v]>0{
m[v]=0
nums1[count]=v
count++
}
}
return nums1[:count]
}
如果两个数组都是排好序的,并且重复的也算上,我们将使用双指针方法。
思路:要取相同的部分,我们用一个for循环,两个数组下标参数来循环控制两个数组,如果两个数组的值相等,则用该值和新数组最后一个值比较,如果相同则跳过,两个数组下标同时加1,进入下一轮循环;如果不相等,则值小的一方数组下标加1直到把其中一个数组遍历完。代码:
func intersect(nums1 []int, nums2 []int) []int {
i, j, k := 0, 0, 0
sort.Ints(nums1)
sort.Ints(nums2)
for i < len(nums1) && j < len(nums2) {
if nums1[i] > nums2[j] {
j++
} else if nums1[i] < nums2[j] {
i++
} else {
nums1[k] = nums1[i]
i++
j++
k++
}
}
return nums1[:k]
}