leetcode350 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例1
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
根据说明的启发,我们意识到对于排好序的数组求两个数组的交集是更为简单便利的操作,我们考虑首先对两个数组进行排序,代码中采用了快速排序的方法;然后我们使用两个指针从头部遍历两个数组。比较两个指针指向的的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。
代码:
func quickSort(nums []int, left int, right int) {
if left >= right {
return
}
temp := nums[left]
start := left
stop := right
for right != left {
for right > left && nums[right] >= temp {
right --
}
for left < right && nums[left] <= temp {
left ++
}
if right > left {
nums[right], nums[left] = nums[left], nums[right]
}
}
nums[right], nums[start] = temp, nums[right]
quickSort(nums, right+1, stop)
quickSort(nums, start, left)
}
func intersect(nums1 []int, nums2 []int) []int {
quickSort(nums1, 0, len(nums1)-1)
quickSort(nums2, 0, len(nums2)-1)
index1 := 0
index2 := 0
length1 := len(nums1)-1
length2 := len(nums2)-1
result := []int{}
for index1 <= length1 && index2 <= length2 {
if nums1[index1] < nums2[index2] {
index1++
} else if nums1[index1] > nums2[index2] {
index2++
} else {
result = append(result, nums1[index1])
index1++
index2++
}
}
return result
}
测试:
调用:
func main() {
nums1 := []int{4,9,5}
nums2 := []int{9,4,9,8,4}
var result []int
result = intersect(nums1,nums2)
fmt.Println(result)
}
结果:
时间复杂度:
对两个数组进行排序的时间复杂度是 O(mlogm+nlogn),遍历两个数组的时间复杂度是 O(m+n),因此总时间复杂度是 O(mlogm+nlogn)
空间复杂度:O(min(m,n))