350. 两个数组的交集 II (python)

一. 题目

给定两个数组,写一个方法来计算它们的交集。

例如:
给定 nums1 = [1, 2, 2, 1]nums2 = [2, 2], 返回 [2, 2].

注意:

  •    输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  •    我们可以不考虑输出结果的顺序。

跟进:

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?

二. 思路及实现代码

1) 自己思路

找出长度最短的list1,然后循环list1判断每一项是否在list2里。因为题干要求了出现次数一致,所以如果list1某一项在list2里,那么list2要remove这一项,否则次数会不一致。

list.remove(i), remove the first item which value is equal to i in the list. 所以可以很好的应用在这。

被注释掉的是范例代码,比较简洁可以学习一下。

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """

        # n1 = nums2 if len(nums1)>=len(nums2) else nums1
        # n2 = nums2 if len(nums1)<len(nums2) else nums1
        # ans = []
        # for i in n1:
        #     if i in n2:
        #         ans.append(i)
        #         n2.remove(i)
        # return ans

        temp_list = []
        if len(nums1) < len(nums2):           
            for items in nums1:
                if items in nums2:
                    temp_list.append(items)
                    nums2.remove(items)
        else:
            for items in nums2:
                if items in nums1:
                    temp_list.append(items)
                    nums1.remove(items)
                  
        return temp_list

2)别人思路 

1> 用时最短范例

排序,双指针

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        
        ans = []
        nums1.sort()
        nums2.sort()
        i = j = 0
        while i<len(nums1) and j < len(nums2):
            if nums1[i] == nums2[j]:
                ans.append(nums1[i])
                i+=1
                j+=1
            elif nums1[i] < nums2[j]:
                i+=1
            else:
                j+=1
        return ans

 值得学习的点:用了三支条件语句,代替了在开始判断数组长度的操作。

具体为,因为两只数组已经按升序排好序,所以当 i 指针和 j 指针指向的数值相等时,放入新list;如果 i 指针指向的数 < j 指针指向的数,那么 i 指针前进;如果 i 指针指向的数 > j 指针指向的数,那么 j 指针前进; 错位遍历。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值