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来避免归并思路的。

  • 相关阅读:
    java 编程语言基础 第一章 自我介绍
    Spring详解(四)------注解配置IOC、DI
    Spring详解(三)------DI依赖注入
    Spring详解(一)------概述
    mybatis 详解(十一)------ mybatis和spring整合
    mybatis 详解(十)------ 逆向工程
    mybatis 详解(九)------ 一级缓存、二级缓存
    mybatis 详解(八)------ 懒加载
    mybatis 详解(七)------一对一、一对多、多对多
    06-单例模式
  • 原文地址:https://www.cnblogs.com/bonelee/p/8728483.html
Copyright © 2011-2022 走看看