首页 > 其他分享 >Swift — LeetCode — 两个数组的交集 II

Swift — LeetCode — 两个数组的交集 II

时间:2022-09-21 12:58:06浏览次数:97  
标签:log Int 复杂度 哈希 II 数组 Swift LeetCode nums2

我正在参加“掘金·帆船计划”

话题

给你两个整数数组 数字1 数字2 ,请将两个数组的交集作为数组返回。返回结果中每个元素的出现次数应与该元素在两个数组中出现的次数相同(如果出现次数不一致,则考虑较小的值)。输出结果的顺序可以忽略。

示例 1:

  • 进入: nums1 = [1,2,2,1],nums2 = [2,2]
  • 输出: [2,2]

示例 2:

  • 进入: nums1 = [4,9,5],nums2 = [9,4,9,8,4]
  • 输出: [4,9]

方法一:哈希表

想法和解决方案

由于相同的数字可能在两个数组中出现多次,因此需要一个哈希表来存储每个数字的出现次数。对于一个数字,相交中出现的次数等于两个数组中该数字的最小出现次数。

首先遍历第一个数组,并记录第一个数组中的每个数以及对应的哈希表中出现的次数,然后遍历第二个数组,对于第二个数组中的每个数,如果哈希表中存在该数哈希表,将数字添加到答案中并减少数字在哈希表中的出现次数。

为了降低空间复杂度,先遍历较短的数组并将每个数和对应的出现次数记录在哈希表中,再遍历较长的数组得到交集。

代码

 类解决方案{  
 func intersect(_ nums1: [ Int], _ nums2: [ Int]) -> [ Int] {  
 如果 nums1.count > nums2.count {  
 返回相交(nums2,nums1)  
 }  
  
 var map: [ Int : Int] = [:]  
 对于 nums1 中的 num {  
 让计数: Int = (map[num] ?? 0) + 1  
 地图[数字] = 计数  
 }  
  
 var 交点:[Int] = []  
 对于 nums2 中的 num {  
 让计数: Int = map[num] ?? 0  
 如果计数 > 0 {  
 交叉点.追加(数量)  
 地图[数字] = 计数 - 1  
 }  
 }  
 返回路口  
 }  
 }  
 复制代码

复杂性分析

  • 时间复杂度:
  • O ( m + n ) O(m+n)
  • O ( m + n ) ,in
  • 毫米
  • 米和
  • nn
  • n 分别是两个数组的长度。需要遍历两个数组并对哈希表进行操作,哈希表操作的时间复杂度为
  • O (1) O(1)
  • O ( 1 ) ,因此总时间复杂度与两个数组的长度之和呈线性关系。
  • 空间复杂度:
  • O ( min ( m , n ) ) O(min(m,n))
  • O ( 分钟 ( 米 , n ) ) , 在
  • 毫米
  • 米和
  • nn
  • n 分别是两个数组的长度。哈希表操作是在较短的数组上进行的,哈希表的大小不会超过较短数组的长度。为返回值创建一个数组
  • 交叉路口
  • 交集,其长度是较短数组的长度。

方法二:排序+双指针

想法和解决方案

如果对两个数组进行了排序,可以使用双指针的方法得到两个数组的交集。

首先对两个数组进行排序,然后使用两个指针遍历两个数组。

最初,两个指针分别指向两个数组的头部。每次比较两个指针所指向的两个数组中的数字,如果两个数字不相等,则指向较小数字的指针右移一位,如果两个数字相等,则将该数字添加到答案,两个指针右移一位。当至少一个指针超出数组边界时,遍历结束。

代码

 类解决方案{  
 func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] {  
 让 newNums1: [Int] = nums1.sorted()  
 让 newNums2: [Int] = nums2.sorted()  
 让 length1: Int = newNums1.count  
 让 length2: Int = newNums2.count  
 var 交点:[Int] = []  
 变量索引1 = 0  
 其中 index2 = 0  
 而 index1 < 长度 1 && 索引 2 < 长度 2 {  
 如果 newNums1 [index1] < newNums2 [index2] {  
 索引1 += 1  
 } else if newNums1 [index1] > newNums2 [index2] {  
 索引2 += 1  
 } 别的 {  
 intersection.append(newNums1 [index1])  
 索引1 += 1  
 索引2 += 1  
 }  
 }  
 返回路口  
 }  
 }  
 复制代码

复杂性分析

  • 时间复杂度:
  • O ( m log ⁡ m + n log ⁡ n ) O(m \log m+n \log n)
  • O ( m lo gm + n lo gn ) ,in
  • 毫米
  • 米和
  • nn
  • n 分别是两个数组的长度。对两个数组进行排序的时间复杂度为
  • O ( m log ⁡ m + n log ⁡ n ) O(m \log m+n \log n)
  • O ( m lo gm + n lo gn ) ,遍历两个数组的时间复杂度为
  • O ( m + n ) O(m+n)
  • O ( m + n ) ,所以总时间复杂度为
  • O ( m log ⁡ m + n log ⁡ n ) O(m \log m+n \log n)
  • 从 (m lo gm + n lo gn)。
  • 空间复杂度:
  • O ( min ⁡ ( m , n ) ) O(\min(m,n))
  • O ( 分钟 ( 米 , n ) ) , 在
  • 毫米
  • 米和
  • nn
  • n 分别是两个数组的长度。为返回值创建一个数组 路口 ,其长度是较短数组的长度。但在 C++ ,我们可以直接创建一个 向量 ,不需要将答案临时存储在一个额外的数组中,所以这个实现的空间复杂度是
  • O (1) O(1)
  • O(1)。

结语

如果

nums2\textit{nums}_2

nums 2 ​ 元素存储在磁盘上,磁盘内存有限,不能一次将所有元素加载到内存中。那么就不可能有效地

nums2\textit{nums}_2

nums 2 ​ 进行排序,所以建议使用方法一而不是方法二。在方法一中,

nums2\textit{nums}_2

nums 2 ​ 只与查询操作有关,所以每次读

nums2\textit{nums}_2

nums 2 ​ 可以完成部分数据的输入和处理。

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议。转载请附上原

这篇文章的链接: https://homecpp.art/1021/9737/1057

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/38470/42132112

标签:log,Int,复杂度,哈希,II,数组,Swift,LeetCode,nums2
From: https://www.cnblogs.com/amboke/p/16715204.html

相关文章

  • 跟我学 JavaScript-VII
    跟我学JavaScript-VIIJavaScript(JS)中的While循环JavaScript系列的第-7天,今天我们将学习While循环如果您是本系列的新手,请查看上一部分—(关联)循环为什么......
  • windows server 2016 安装IIS失败
    windowsserver2016默认是不安装.netframework3.5的,可以在添加删除程序中单独添加。但是有时候系统安装文件不在的时候,找不到安装程序就不能安装成功。这时候单独下载dot......
  • js generate ASCII table dict All In One
    jsgenerateASCIItabledictAllInOneASCIItabledictgeneratorcharCodeAt&String.fromCodePoint//jsgenerator&ASCIItabledictconstdict={};......
  • 字符编码笔记:ASCII,Unicode 和 UTF-8
    一、ASCII码我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说......
  • 刷题笔记(leetcode02-两数相加)
    普通的循环解法,C代码:1/**2*Definitionforsingly-linkedlist.3*structListNode{4*intval;5*structListNode*next;6*};7......
  • C#处理读取使用US7ASCII的oracle数据库中文显示乱码问题
    方式一:(推荐)OracleDataAccessComponents(ODAC)+OleDbConnection该方式无需配置环境变量1、下载ODAC组件,地址为https://www.oracle.com/technetwork/topics/dotne......
  • LeetCode 698
    LeetCode2022.9.20的打卡题目698划分为k个相等的子集[https://leetcode.cn/problems/partition-to-k-equal-sum-subsets]给定一个整数数组  nums和一个正整数k,......
  • 9.20Leetcode记录
    一、字符串的排列题干:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s="abc"输出:["abc","a......
  • LeetCode/划分k个相等的子集
    给定一个整数数组nums和一个正整数k,找出是否有可能把这个数组分成k个非空子集,其总和都相等一.回溯法1.对每个数,回溯放入子集(球视角)只关心每个球是否成功放入,......
  • [LeetCode] 954. Array of Doubled Pairs
    Givenanintegerarrayofevenlength arr,return true ifitispossibletoreorder arr suchthat arr[2*i+1]=2*arr[2*i] forevery 0<=i<le......