• leetcode 350. Intersection of Two Arrays II


    Given two arrays, write a function to compute their intersection.

    Example:
    Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].

    Note:

    • Each element in the result should appear as many times as it shows in both arrays.
    • The result can be in any order.

    Follow up:

    • What if the given array is already sorted? How would you optimize your algorithm?
    • What if nums1's size is small compared to nums2's size? Which algorithm is better?
    • What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?

    class Solution(object):
        def intersect(self, nums1, nums2):
            """
            :type nums1: List[int]
            :type nums2: List[int]
            :rtype: List[int]
            """
            # use sort, or set(Counter)
            ans = []
            cnt = collections.Counter(nums1)
            for n in nums2:
                if n in cnt and cnt[n] > 0:
                    cnt[n] -= 1
                    ans.append(n)
            return ans

    可以更精简些:

    from collections import Counter
    
    class Solution(object):
        def intersect(self, nums1, nums2):
            c1, c2 = Counter(nums1), Counter(nums2)
            return sum([[num] * min(c1[num], c2[num]) for num in c1 & c2], [])

    自己写的话:

    class Solution(object):
        def intersect(self, nums1, nums2):
    
            counts = {}
            res = []
    
            for num in nums1:
                counts[num] = counts.get(num, 0) + 1
    
            for num in nums2:
                if num in counts and counts[num] > 0:
                    res.append(num)
                    counts[num] -= 1
    
            return res

    注意:

    class Solution(object):
        def intersect(self, nums1, nums2):
            """
            :type nums1: List[int]
            :type nums2: List[int]
            :rtype: List[int]
            """
            # use sort, or set(Counter)
            return list(set(nums1) & set(nums2))

    是不可以的,因为set里是没有重复数据的:

    Input: [1,2,2,1] [2,2]
    Output: [2]

    Expected: [2,2]

    另外就是使用sort,归并思路:

    class Solution(object):
        def intersect(self, nums1, nums2):
            """
            :type nums1: List[int]
            :type nums2: List[int]
            :rtype: List[int]
            """
            # use sort, or set(Counter)
            nums1.sort()
            nums2.sort()
            i = j = 0
            ans = []
            l1, l2 = len(nums1), len(nums2)
            while i < l1 and j < l2:
                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

     还有使用binsearch来避免归并思路的。

  • 相关阅读:
    sqlserver2008 查看数据库自带的索引建议
    DataSnap服务器生成的ID自动更新到客户端
    outlook 插件:导出rss的link地址
    eclipse 升级note
    合并百度影音的离线数据 with python 2.2 bdv格式的更新
    windows ubuntu bcdeditor
    合并百度影音的离线数据 with python 2.1 bdv格式的更新
    合并百度影音的离线数据 with python 第二版 基于yield
    php密码加密(密码散列)
    PHP (超文本预处理器)
  • 原文地址:https://www.cnblogs.com/bonelee/p/8728483.html
Copyright © 2020-2023  润新知