【力扣】350. 两个数组的交集 II

350. 两个数组的交集 II
注意,题中有个进阶要求:

如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

这时推荐哈希表解法。
因为无法一次加载nums2的元素到内存中的话,无法对nums2进行排序;而哈希表算法中只对nums2进行查询操作。

解法一:先排序,然后用指针

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        先排序,后指针
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums1.sort()
        nums2.sort()
        pos1 = pos2 = 0
        intersection = []
        while pos1 < len(nums1) and pos2 < len(nums2):
            if nums1[pos1] == nums2[pos2]:
                intersection.append(nums1[pos1])
                pos1 += 1
                pos2 += 1
            elif nums1[pos1] < nums2[pos2]:
                pos1 += 1
            else:
                pos2 += 1
        return intersection

解法二:哈希表

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        哈希表
        先遍历一个数组,将其中数字出现的次数记录下来,每出现一次值+1
        然后再遍历另一个数组,数字每出现一次就将哈希表中对应的值-1
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        len1 = len(nums1)
        len2 = len(nums2)
        # 为了降低空间复杂度,先遍历短的数组(这是为什么???????)
        if len1 > len2:
             # 交换两个入参的位置来达到交换两个数组的效果
            return self.intersect(nums2, nums1)    
        
        table = dict()
        for i in nums1:
            if i not in table:
                table[i] = 1
            else:
                table[i] += 1
        intersection = []
        for i in nums2:
            if i in table and table[i] != 0:
                table[i] -= 1
                intersection.append(i)
        return intersection

解法三:暴力

这是我自己写的,强行解答,嘻嘻

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        暴力法
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums = []
        for i in nums1:
            for j in nums2:
                if i == j:
                    nums.append(j)
                    break
            try:
                nums2.remove(i)
            except Exception:
                pass
        return nums
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值