Table of Contents

一、中文版

二、英文版

三、My answer

四、解题报告


一、中文版

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

示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

二、英文版

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

Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]
Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]
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?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

三、My answer

class Solution:def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
#         version 1:好写,但时间复杂度高 O(n^2)# res = []for num in nums1:# if nums2 is None:if not nums2:return reselif num in nums2:res.append(num)nums2.remove(num)return res#     version 2: 两个dictionary,dict1 = {}dict2 = {}res = []for num in nums1:if num in dict1:dict1[num] += 1else:dict1[num] = 1for num in nums2:if num in dict2:dict2[num] += 1else:dict2[num] = 1for key in dict1:if key in dict2:res = res + [key] * min(dict1[key],dict2[key])return res#     version 3: 一个dictionary_dict = {}res = []for num in nums1:if num in _dict:_dict[num] += 1else:_dict[num] = 1for num in nums2:if num in _dict and _dict[num] >= 1:_dict[num] -= 1res.append(num)return res#     version 4:双指针i = 0j = 0m = len(nums1)n = len(nums2)res = []nums1.sort()nums2.sort()while i < m and j < n:while i < m and j < n and nums1[i] < nums2[j]:i += 1while i < m and j < n and nums1[i] > nums2[j]:j += 1if i < m and j < n and nums1[i] == nums2[j]:res.append(nums1[i])i += 1j += 1return res#     version 5: version 4 的清晰版i = 0j = 0m = len(nums1)n = len(nums2)res = []nums1.sort()nums2.sort()while i < m and j < n:if nums1[i] < nums2[j]:i += 1elif nums1[i] > nums2[j]:j += 1else:res.append(nums1[i])i += 1j += 1return res

四、解题报告

version 1:遍历 nums1 中的数字,判断其是否在 nums2 中,如果存在,即是两个数组的交集,放入 res 中并在 nums2 中删除该数字以免重复查找。时间复杂度:外层 for 循环是 O(n),内层 remove() 是 O(n),所以总时间复杂度是 O(n^2)。

version 2:使用两个字典,分别记录 nums1 nums2 中数字出现的个数。遍历 dict1 的 key,如果 dict2 中也有,则取两个value的最小值,及一个 num 在两个 nums 中出现的个数,也就是在交集中的个数。时间复杂度 O(n),空间复杂度 O(n)。

version 3:version 2 的简化版,只使用一个字典。将 nums1 的数字整理放入字典中,key 是 num,value 是出现的个数。再遍历 nums2 中的数,如果该数在 字典中有且个数 >= 1,则放入 res 中并将个数 -1。如果个数为 0  表示 nums1 中已经没有该数,不再属于交集。时间复杂度 O(n),空间复杂度 O(n)。

version 4:双指针。两个数组排序后,用两个指针分别遍历两个数组,对所指向数字比较大小。如果相等则属于交集,否则谁小就移动谁,直到相等。时间复杂度 O(nlogn):由于排序的时间复杂度为 O(nlogn),遍历的时间复杂度为 O(n),所以整体时间复杂度为 O(nlogn)。空间复杂度 O(1)。

version 5:version 4 的清晰版,while 改成  if 即可。

LeetCode 350. 两个数组的交集 II ntersection of Two Arrays II相关推荐

  1. LeetCode 350. 两个数组的交集 II

    350. 两个数组的交集 II 难度简单640收藏分享切换为英文接收动态反馈 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集.返回结果中每个元素出现的次数,应与元素在两 ...

  2. Leetcode 350. 两个数组的交集 II 解题思路及C++实现

    解题思路: 和349. 两个数组的交集 这道题目很相似,这道题只是在返回的数组中,多了重复的数字,其实相较于349题,350题更简单. 先对两个数组进行排序,然后遍历这两个数组,找到相同的数字之后,就 ...

  3. LeetCode 350. 两个数组的交集 II(哈希)

    文章目录 1. 题目 2. 解题 2.1 hash 2.2 数组已排序 1. 题目 给定两个数组,编写一个函数来计算它们的交集. 示例 1:输入: nums1 = [1,2,2,1], nums2 = ...

  4. 12. Leetcode 350. 两个数组的交集 II (数组-分离双指针)

    给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集.返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值).可以不考虑输出 ...

  5. LeetCode——350. 两个数组的交集 II

    题目描述: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 示例 2: 输入:nums1 = [4, ...

  6. 两个对象数组交集_yiduobo的每日leetcode 349.两个数组的交集 amp;amp; 350.两个数组的交集II...

    祖传的手艺不想丢了,所以按顺序写一个leetcode的题解.计划每日两题,争取不卡题吧 349.两个数组的交集https://leetcode-cn.com/problems/intersection ...

  7. LeetCode -349 两个数组的交集

    难度:简单 给定两个数组 nums1 和 nums2 ,返回它们的交集 .输出结果中的每个元素一定是唯一 的.我们可以不考虑输出结果的顺序 . 题目链接 LeetCode -349 两个数组的交集 S ...

  8. leetcode系列-350.两个数组的交集II

    leetcode系列–第350题.两个数组的交集II 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集. 返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一 ...

  9. Leetcode-数据结构-350. 两个数组的交集 II

    问题 给两个整数数组 nums1 和 nums2 ,请以 数组形式 返回两数组的 交集 (其在交集中出现的次数:等于该数字在两个数组中出现次数的最小值). 返回结果中 每个元素出现的次数(for遍历) ...

最新文章

  1. 消息队列怎么保证消息有没有重复消费(幂等性)?
  2. 解决使用mybatis分页插件PageHelper的一个报错问题
  3. Flyway 执行报错: 'user_variables_by_thread' 表没有SELECT权限问题
  4. SQLite3-各个函数
  5. 二、Windows基础数据类型
  6. MySQL数据库Innodb储存引擎----储存页的结构
  7. android.support.v7.widget.,关于android.support.v7.widget.RecyclerView的使用,总是找不到类...
  8. 重温《数据库系统概论》【第一篇 基础篇】【第5章 数据库完整性】
  9. 华为云发起美食图片分类大赛!奖品丰厚还可免费使用云资源
  10. 最大数组全局还是局部的问题
  11. 最新AZ自动发卡网源码
  12. GPS测量原理与应用_第四版_徐绍铨_武汉大学出版社_考试复习资料
  13. gamit批量下载精密星历shell脚本
  14. [ERROR] Error executing Maven.
  15. IDEA 光标快捷键
  16. k8s client-go 出现错误net/http: TLS handshake timeout
  17. 驾考 科目一 复习的内容
  18. 计算机公共基础知识总结,计算机公共基础知识总结.docx
  19. R基础学习(一)数据结构
  20. 跳槽的必要条件是有一份好的简历

热门文章

  1. Linux文件的颜色代码
  2. java的类加载器都有哪些_java类加载器包括哪些内容?树状结构示意图展示
  3. 从5大头号黑客的“黑转白”历史,悟出的一套黑客修炼之道
  4. 内网渗透——搭建域控制器
  5. 史上最简单的C#客户端连接阿里云物联网平台
  6. QQ 可以注销,青春如何删除?
  7. linux shell 字符串开头,shell字符串匹配的实现
  8. python链家网爬虫_手把手教你利用Python网络爬虫获取链家网的房产信息
  9. Android 生成长图并添加水印(三)
  10. 金太阳联考2021高考成绩查询入口,金太阳教育湖南省2021高二联考分数查询