1:题目描述(力扣)
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
2:解题思路
方法一:使用哈希结构-数组:
定义一个哈希数组,存储数组元素出现的次数,索引表示数组nums1和nums2中出现的元素,索引对应的值表示数组nums1和nums2中元素出现的次数。先遍历数组nums1,统计nums1中元素出现的次数;再遍历数组nums2,判断元素在哈希数组中的索引对应的值是否大于0,大于0则表示元素在数组nums1中出现过一次,将元素添加到目标数组中,并将哈希数组中元素索引对应的值减1;等于0则表示元素未在数组nums1中出现,继续遍历数组nums2,直达遍历结束。
第一步:定义一个哈希数组hash_list,用来存储数组nums1/nums2中元素出现次数,初始长度设为1005,默认全为0;
第二步:定义一个数组res,用来存储数组nums1和nums2的交集;
第三步:那我们先遍历数组nums1,将nums1中元素出现的次数统计到hash_list中;
第四步:再遍历数组nums2,判断元素在hash_list中对应索引的值是否大于0,大于0,表示该元素在nums1中出现了,我们就把元素添加到数组res中,并将元素在hash_list中对应索引的值减1;
第五步:返回res
代码展示:
# 通过哈希表结构-数组
# 下标表示数组中出现的整数,元素表示整数出现的次数
class Solution:
def intersect(self, nums1, nums2):
hash_list = [0] * 1005 # 定义固定长度的数组
res = [] # 存储结果的数组
for i in nums1: # 遍历数组nums1
hash_list[i] += 1 # 将数组中元素出现的次数统计到数组hash_list中
for j in nums2: # 遍历数组nums2
if hash_list[j] > 0: # 判断nums2中的元素,在hash_list中对应的值是否大于0
res.append(j) # 大于0,将元素添加到res中
hash_list[j] -= 1 # 并将hash_list中对应的值减1
return res
方法二:排序+双指针
先对数组nums1和nums2进行排序,然后使用两个指针遍历两个数组。初始时,两个指针指向数组nums1和nums2的头部,比较两个指针对应的元素,若一个指针对应的元素小于另外一个指针对应的元素,则将元素小的指针向右移动一位,当两个指针对应的元素相等,则将元素加入目标数组中,并将两个指针均向右移动一位,当至少有一个指针的值超出数组的范围时,遍历结束。
第一步:对数组nums1和nums2进行排序;
第二步:定义目标数组res;
第三步:获取两个数组的长度,muns1_len,nums2_len;
第四步:定义两个指针nums1_p,nums2_p,初始值均为0;
第五步:判断muns1_len与nums1_p的大小,muns2_len与nums2_p的大小,当nums1_p < nums1_len 并且 nums2_p < nums2_len时,进入循环,遍历数组;
第六步:判断nums1_p、nums2_p在数组nums1、nums2中对应元素的大小,
nums1[num1_p]<nums2[nums2_p],nums1_p向右移动一位,
nums1[num1_p]>nums2[nums2_p],nums2_p向右移动一位,
nums1[num1_p]=nums2[nums2_p],将元素nums1[num1_p]加入目标数组res,nums1_p,nums2_p均向右移动一位;
第七步:返回目标数组res。
代码展示:
# 排序+双指针
class Solution:
def intersect(self, nums1, nums2):
nums1.sort() # 对nums1进行排序
nums2.sort() # 对nums2进行排序
res = []
nums1_len, nums2_len = len(nums1), len(nums2) # 获取两个数组的长度
nums1_p, nums2_p = 0, 0 # 定义两个指针,初始均指向数组的起始位置
while nums1_p < nums1_len and nums2_p < nums2_len:
# 当两个指针都分别小于数组的长度时
if nums1[nums1_p] < nums2[nums2_p]:
# 当nums1的元素小于nums2的元素时,移动nums1的指针
nums1_p += 1
elif nums1[nums1_p] > nums2[nums2_p]:
# 当nums1的元素大于nums2的元素时,移动nums2的指针
nums2_p += 1
else:
# 当nums1的元素等于nums2的元素时,将元素加入res中,并同时移动两个指针
res.append(nums1[nums1_p])
nums1_p += 1
nums2_p += 1
return res