两个数组的交集是指两个数组中共有的元素组成的集合。通常情况下,我们需要找出两个数组中都存在的元素,并且结果中每个元素只出现一次。
假设我们有两个已排序的数组nums1
和nums2
,我们需要找到它们的交集,并且要求空间复杂度为O(1)(即就地操作)。
如何在不使用额外空间的情况下,找到两个已排序数组的交集?
如果数组未排序,直接找交集通常需要使用哈希表,这会引入额外的空间复杂度。即使是已排序的数组,直接使用双指针法也需要额外的空间来存储结果。
我们可以使用双指针法,并且在原数组上进行操作,以满足空间复杂度为O(1)的要求。具体步骤如下:
i
和j
分别指向nums1
和nums2
的起始位置。k
用于记录结果数组的位置。nums1[i]
和nums2[j]
:nums1[i]
小于nums2[j]
,则移动指针i
。nums1[i]
大于nums2[j]
,则移动指针j
。def intersect(nums1, nums2):
i, j = 0, 0
k = 0
while i < len(nums1) and j < len(nums2):
if nums1[i] == nums2[j]:
# 避免重复元素
if k == 0 or nums1[k-1] != nums1[i]:
nums1[k] = nums1[i]
k += 1
i += 1
j += 1
elif nums1[i] < nums2[j]:
i += 1
else:
j += 1
return nums1[:k]
# 示例
nums1 = [1, 2, 2, 1]
nums2 = [2, 2]
print(intersect(nums1, nums2)) # 输出: [2, 2]
通过上述方法,我们可以在O(n)的时间复杂度和O(1)的空间复杂度内找到两个已排序数组的交集。
领取专属 10元无门槛券
手把手带您无忧上云