【LeetCode刷题】350. 两个数组的交集 II

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值