LeetCode两个数组的交集||

LeetCode两个数组的交集||

题目:找出两个列表中有交集的元素(如有重复取最小)
解法:5种
推荐:方法4
语言:python

题目介绍如下:
两个数组的交集||

题目通俗说明:

给定两个列表,找出两个列表中相同的元素,如果有重复按照出现次数少的规则找出,最终返回结果列表

解法如下:

# author:铁臂阿童木

# datetime:2022/1/28 13:14

# software: PyCharm


# 题目:两个数组的交集||
# 解法:5种
# 推荐:方法4

# 先定义两对条件列表
nums1 = [1, 2, 2, 1]
nums2 = [2, 2]

nums3 = [4, 9, 5]
nums4 = [9, 4, 9, 8, 4]

# 序号:方法一
# 方法:循环对比删除法
# 思想:短列表中元素与长列表中元素循环比对,如果有相等的元素就加入到新列表中再将短列表和长列表中该元素删除
# 优点:简单
# 缺点:耗时耗空间
def intersect(nums1, nums2):
    l1 = len(nums1)
    l2 = len(nums2)
    if l1 > l2:
        temp = nums1
        nums1 = nums2
        nums2 = temp
    nums = []             # 定义一个空列表存放相等的元素
    i = 0                 # 短列表中的指针
    while i < len(nums1):
        j = 0             # 常列表中的指针
        flag = 0          # 本次长列表循环中是否比对成功出现相同元素
        while j < len(nums2):
            if nums1[i] == nums2[j]:    # 循环判断长列表中是否有与短列表中第i个元素相等的元素
                nums.append(nums1[i])   # 如果有就将短列表中这个元素加到定义好的列表中
                del (nums1[i])          # 再将短列表和长列表中相等的元素同时删除
                del (nums2[j])
                flag = 1       # 标志长列表有元素与短列表元素匹配成功
                break          # 对短列表进行下次循环
            else:
                j += 1
        if flag == 0:        # 如果长列表所有元素与短列表中第i个元素没有匹配上
            if len(nums1) == 1:  # 如果短列表只剩最后一个元素,那么循环长列表元素比对结束后没有符合条件的直接退出循环,否则会进行无限循环
                break
            i += 1           # 对短列表进行下次循环
    return nums

# print(intersect(nums1, nums2))


# 序号:方法二
# 方法:匹配删除法
# 思想:循环列表一,对每个元素与列表二做in运算,如果存在就将其添加到结果列表中,并将列表二中的该元素删除
# 优点:省内存
# 缺点:耗时
def intersect2(nums1, nums2):
    res = []
    for num in nums1:
        if num in nums2:
           res.append(num)
           nums2.remove(num)
    return res

# print(intersect2(nums1, nums2))


# 序号:方法三
# 方法:交集计数法
# 思想:将两个列表转化成集合去交集,再对结果中的元素去短列表中循环计数,最后按个数输出
# 优点:
# 缺点:耗时
def intersect3(nums1, nums2):
    s1 = set(nums1)     # 将两个列表转化成集合
    s2 = set(nums2)
    nums = []          # 定义一个新列表,准备存最终结果
    for s in s1&s2:    # 对两个集合求交集,再对交集中的元素进行循环
        for i in range(min(nums1.count(s),nums2.count(s))):  # 找出(交集中的元素在两个列表中出现的次数少)的次数
            nums.append(s)         # 再将此元素循环上述次追加到新列表中
    return nums

# print(intersect3(nums1, nums2))


# 序号:方法四
# 方法:hash对比法
# 思想:将短列表添加到hash表中,让长列表与hash表进行对比,比对成功就将此元素添加到结果列表中
# 优点:速度快
# 缺点:
def intersect4(nums1, nums2):
    hashmap = {}          # 定义一个哈希表
    if len(nums1) > len(nums2):       # 调整两个列表的顺序为先小后大
        temp = nums1
        nums1 = nums2
        nums2 = temp
    for num in nums1:       # 将短列表中的元素添加到哈希表中,以(值:个数)的形式存入
        if num in hashmap:
            hashmap[num] += 1    # 如果已存在就给它的值+1
        else:
            hashmap[num] = 1
    res = []               # 定义一个存放结果的列表
    for num in nums2:
        if num in hashmap and hashmap[num] > 0:   # 用长列表中的元素与哈希表中元素进行对比
            res.append(num)          # 将此元素追加到结果列表
            hashmap[num] -= 1        # 如果存在就将hash表中元素对应的值-1
    return res

# print(intersect4(nums3, nums4))


# 序号:方法五
# 方法:双指针比对法
# 思想:将两个列表排序后利用双指针比对
# 优点:省内存
# 缺点:
def intersect5(nums1, nums2):
    nums1.sort()
    nums2.sort()        # 对列表排序
    l1 = len(nums1)
    l2 = len(nums2)
    i = 0
    j = 0
    res = []       # 定义存放结果的列表
    while i < l1 and j < l2:
        if nums1[i] == nums2[j]:   # 如果两列表对应元素相等
            res.append(nums1[i])   # 就将其追加到结果列表中
            i += 1
            j += 1             # 再让两个指针都向后移1位
        elif nums1[i] < nums2[j]:   # 如果前面指针的值<后面指针的值,就让前面指针向后移一位
            i += 1
        else:              # 如果前面指针的值>后面指针的值,就让后面指针向后移一位
            j += 1
    return res

print(intersect5(nums3, nums4))


经验:

如果自己编写中出现错误,就针对简单示例数据进行测试,使用编译器的调试工具打断点测试!

个人心得

1.多考虑其他数据结构的特点,例如hash表的特点
2.注意代码简洁度
3.注释不能太多

感谢阅读!!!
有错误请您指出!!!
欢迎补充!!!

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值