【数据结构-leetcode系列】5.两个数组的交集(No.350)

题目链接如下:

350. 两个数组的交集 IIhttps://leetcode.cn/problems/intersection-of-two-arrays-ii/

方法总结:

(1)字典快速查询

(2)sort()+双指针

(1)第一反应,统计个数用Counter()(python自带强大的collections库)最便捷的字典,不过这种方法还是慢了:

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        c1=collections.Counter(nums1)#很强的内置collections库
        c2=collections.Counter(nums2)
        #print(c1,c2)
        inter=[]
        for i1,num1 in c1.items():
            #print(i1,num1)
            for i2,num2 in c2.items():#注意,字典中遍历items不是item
                if i1==i2:
                    inter+=[i1]*min(num1,num2)
        return inter

 两个循环还是影响效率了,所以优化一下:

【用collections.Counter()产生一个统计个数的字典,然后只使用一个循环检索另一个list中的元素】

代码如下:

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # if len(nums1)>len(nums2):
        #     nums1,nums2=nums2,nums1
        if len(nums1) > len(nums2):
           return self.intersect(nums2, nums1)
        
        m = collections.Counter(nums1)
        print(m)
        # for num in nums1:
        #     m[num] += 1
        # print(m)
        
        intersection = list()
        for num in nums2:
            #counter个数>0
            if m.get(num, 0)>0:
            #if (count := m.get(num, 0)) > 0:
                intersection.append(num)
                m[num] -= 1
                if m[num] == 0:
                    m.pop(num)
        
        return intersection

(2)一种更有趣的方法,排序+双指针,效率极高:

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        #排序+双指针 
        #排序后变为有序排列,循环索引的时候不会漏掉
        nums1.sort()
        nums2.sort()
        i,j=0,0
        intersect=[]
        while i<len(nums1) or j<len(nums2):
            if i==len(nums1):#说明nums1已经遍历完成,后面没有符合条件的数据
                break
            elif j==len(nums2):
                break
            if nums1[i]<nums2[j]:
                i+=1
            elif nums1[i]>nums2[j]:
                j+=1
            else:#nums1[i]==nums2[j]:
                 intersect.append(nums1[i])
                 i+=1
                 j+=1
        return intersect 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值