zoukankan      html  css  js  c++  java
  • 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来避免归并思路的。

  • 相关阅读:
    JDK1.7签名APK异常
    tomcat设置虚拟目录
    java runtime.exec() 的讲解(转贴)
    linux 下 .sh 文件语法
    Maven基础-配置远程仓库
    jdk工具keytool和jarsigner帮助Part2(jdk keytool&jarsigner tool manual)
    jdk工具keytool和jarsigner帮助Part1(jdk keytool&jarsigner tool manual)
    spring mvc + freemarker 引入静态文件(css,img,js)
    FilterDispatcher 的作用
    Struts2 过滤器与拦截器
  • 原文地址:https://www.cnblogs.com/bonelee/p/8728483.html
Copyright © 2011-2022 走看看