350. Intersection of Two Arrays II 两个数组的交集 II

Title

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

示例 1:

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

示例 2:

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

说明:

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

排序

Solve

如果两个数组是有序的,则可以便捷地计算两个数组的交集。

首先对两个数组进行排序,然后使用两个指针遍历两个数组。

初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。

Code

	def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
		nums1.sort()
		nums2.sort()
		i, j, length1, length2, ans = 0, 0, len(nums1), len(nums2), []
		while i < length1 and j < length2:
			if nums1[i] == nums2[j]:
				ans.append(nums1[i])
				i += 1
				j += 1
			elif nums1[i] < nums2[j]:
				i += 1
			else:
				j += 1
		return ans

复杂度分析

时间复杂度:O(mlogm+nlogn),其中 m 和 n 分别是两个数组的长度。对两个数组进行排序的时间复杂度是 O(mlogm+nlogn),遍历两个数组的时间复杂度是 O(m+n),因此总时间复杂度是 O(mlogm+nlogn)。

空间复杂度:O(min(m,n)),其中 m 和 n 分别是两个数组的长度。

你可能感兴趣的:(#,LeetCode)