zoukankan      html  css  js  c++  java
  • python(leetcode)-350两个数组的交集

    给定两个数组,编写一个函数来计算它们的交集。
    
    示例 1:
    
    输入: nums1 = [1,2,2,1], nums2 = [2,2]
    输出: [2,2]
    示例 2:
    
    输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出: [4,9]
    说明:
    
    输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
    我们可以不考虑输出结果的顺序。
    进阶:
    
    如果给定的数组已经排好序呢?你将如何优化你的算法?
    如果 nums1 的大小比 nums2 小很多,哪种方法更优?
    如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
    

    看完问题描述 发现看似简单 但是其实有一点点的难 难点在于如果2个数组中存在重复数字,则交集也必须重复

    先说下 自己当时的想法 

    没有想到什么简单方法 只能使用蛮力法 通过两层循环 每一个数字与另外一个数组中的数字对比。并且加一个判断,如果相同则在之后的对比时不对比此下标的值

    上代码(通过-用时110ms)

     1 class Solution:
     2 
     3     def intersect2(self, nums1, nums2):
     4         """
     5         :type nums1: List[int]
     6         :type nums2: List[int]
     7         :rtype: List[int]
     8         """
     9         result = []
    10 
    11         for i in nums1:
    12             for j in nums2:
    13                 if i == j:
    14                     result.append(i) #插入交集
    15                     nums2.remove(j)  #插入过的值不再出现
    16                     break
    17         return result
    18 if __name__=="__main__":
    19     nums1=[1,2,2,1]
    20     nums2=[1,2]
    21     s=Solution()
    22     print(s.intersect(nums1,nums2))

    这个是笔者想到的方法。使用蛮力法,比较耗时,需要110ms。

    然后上评论区大佬的代码(特别赏心悦目 5行代码解决问题)

     1 class Solution(object):
     2     def intersect(self, nums1, nums2):
     3         """
     4         :type nums1: List[int]
     5         :type nums2: List[int]
     6         :rtype: List[int]
     7         """
     8         inter = set(nums1) & set(nums2)     #inter为两个list的相同元素
     9         l = []
    10         for i in inter:
    11             l += [i] * min(nums1.count(i), nums2.count(i)) #相同元素的共同出现次数
    12         return l

    这个方法比较难想,是一个很有趣的解法

    思想:通过set的唯一性找出两list的唯一交集,再利用min方法找到交集的共同出现次数

    前面方法的效率较低 介绍一种方法使用字典进行查找

    思想:通过key,value进行存储,key为值的个数,value为值。 先把nums1存放入字典中。遍历nums2中的值对比字典,相同则数量减一并放入list中,最后返回list

     1 class Solution:
     2     #利用字典实现交集
     3     def intersect(self,nums1,nums2):
     4         record={}
     5         result=[]
     6         for i in nums1:
     7             # 注意python3.x用contains()方法取代has_key()
     8             if(record.__contains__(i)):
     9                 record[i]+=1                      #将字典的key值数+1
    10             else:
    11                 record[i]=1                       #将i加入字典中 key为1
    12         for j in nums2:
    13             if(record.__contains__(j) and record[j]>0): 
    14                 record[j]-=1                      #i的key值减1
    15                 result.append(j)
    16         return result
    17 if __name__=="__main__":
    18     s=Solution()
    19     num1=[1,2,3,4,4,1]
    20     num2=[4,2,3]
    21     print(s.intersect(num1,num2))

    值得注意的是:python 3.x的版本将has_key()方法换为_contains_()

    会发现通过时间为48ms 效率有所提升

  • 相关阅读:
    C#中递归算法的总结
    C# 创建错误日志
    获取指定路径下所有PDF文件的总页数
    C# 将文件转为字符串和将字符串转为文件的方法
    如何获得应用程序的物理路径
    C#中获得文件夹下所有文件的两种方法
    C#中加密与解密
    MacOS系统使用Homebrew官方地址报错
    privoxy代理服务器配置
    Nginx 反向代理 502 permission denied 解决
  • 原文地址:https://www.cnblogs.com/bob-jianfeng/p/10370307.html
Copyright © 2011-2022 走看看