给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
网址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/ha-xi-biao-liang-ge-shu-zu-de-jiao-ji-ii-fkwo/
解题思路:
通过题意,寻找两数组是否有相同项,并且提示中说可以不要求交集的顺序。
既然如此,我们便可以先行将数组排序,方便我们查找,然后正式流程如下:
- 创建一个指针 ii 指向 nums1nums1 数组首位,指针 jj 指向 nums2nums2 数组首位。
- 创建一个临时栈,用于存放结果集。
- 开始比较指针 ii 和指针 jj 的值大小,若两个值不等,则数字小的指针,往右移一位。
- 若指针 ii 和指针 jj 的值相等,则将交集压入栈。
- 若 numsnums 或 nums2nums2 有一方遍历结束,代表另一方的剩余值,都是唯一存在,且不会与之产生交集的。
图解:
- 第一步:首先将nums1和num2排序
- 第二步:排序后如下
第三步:创建指针i,j
- 第四步:
- 第五步:
- 第六步:
- 第七步:
- 第八步:
- 第九步:
- 第十步:
代码逐步解析:双指针方法
class Solution:
def intersect(self, nums1, nums2):
print('原nums1:',nums1)
print('原nums2:',nums2)
nums1.sort()
nums2.sort()
print('后nums1:',nums1)
print('后nums2:',nums2)
length1, length2 = len(nums1), len(nums2)
print('length1:', length1)
print('length2:', length2)
intersection = list()
index1 = index2 = 0
while index1 < length1 and index2 < length2:
print('index1:', index1)
print('index2:', index2)
print('nums1[index1]:', nums1[index1])
print('nums2[index2]:', nums2[index2])
if nums1[index1] < nums2[index2]:
index1 += 1
elif nums1[index1] > nums2[index2]:
index2 += 1
else:
intersection.append(nums1[index1])
index1 += 1
index2 += 1
return intersection
if __name__ == '__main__':
s = Solution()
nums1 = [1, 2, 2, 1]
nums2 = [2, 2]
result_list = s.intersect(nums1, nums2)
print('result_list:', result_list)
输出为:
原nums1: [1, 2, 2, 1]
原nums2: [2, 2]
后nums1: [1, 1, 2, 2]
后nums2: [2, 2]
length1: 4
length2: 2
index1: 0
index2: 0
nums1[index1]: 1
nums2[index2]: 2
index1: 1
index2: 0
nums1[index1]: 1
nums2[index2]: 2
index1: 2
index2: 0
nums1[index1]: 2
nums2[index2]: 2
index1: 3
index2: 1
nums1[index1]: 2
nums2[index2]: 2
result_list: [2, 2]