力扣-349. 两个数组的交集

news/发布时间2024/5/17 17:09:46

1.题目

题目地址(349. 两个数组的交集 - 力扣(LeetCode))

https://leetcode.cn/problems/intersection-of-two-arrays/

题目描述

给定两个数组 nums1 和 nums2 ,返回 它们的

 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

 

示例 1:

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

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

 

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

2.题解

2.1 哈希集合

思路

使用unordered_set进行去重,然后查看交集即可

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> st1, st2;vector<int> ans;for(int &num : nums1){st1.emplace(num);}for(int &num : nums2){st2.emplace(num);}for(const int &num : st1){if(st2.count(num)){ans.emplace_back(num);}}return ans;}
};

复杂度分析

  • 时间复杂度:\(O(m+n)\),其中\(m\)\(n\)分别是两个数组的长度。
    使用两个集合分别存储两个数组中的元素需要\(O(m+n)\)的时间,
    遍历较小的集合并判断元素是否在另一个集合中需要\(O(\min(m,n))\)的时间,
    因此总时间复杂度是\(O(m+n)\)
  • 空间复杂度:\(O(m+n)\),
    其中\(m\)\(n\)分别是两个数组的长度。
    空间复杂度主要取决于两个集合。

2.2 排序+双指针

思路

代码

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 = nums1.size(), length2 = nums2.size();int index1 = 0, index2 = 0;vector<int> intersection;while (index1 < length1 && index2 < length2) {int num1 = nums1[index1], num2 = nums2[index2];if (num1 == num2) {// 保证加入元素的唯一性if (!intersection.size() || num1 != intersection.back()) {intersection.push_back(num1);}index1++;index2++;} else if (num1 < num2) {index1++;} else {index2++;}}return intersection;}
};

复杂度分析

  • 时间复杂度:\(O(m\log m+n\log n)\),其中\(m\)\(n\)分别是两个数组的长度。
    对两个数组排序的时间复杂度分别是\(O(m\log m)\)\(O(n\log n)\) ,
    双指针寻找交集元素的时间复杂度是\(O(m+n)\) ,
    因此总时间复杂度是\(O(m\log m+n\log n)\)
  • 空间复杂度:\(O(\log m+\log n)\),其中\(m\)\(n\)分别是两个数组的长度。
    空间复杂度主要取决于排序使用的额外空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/88774357.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

认知提升的方法

认知提升的方法一、什么是认知 经验是对于过往经历的总结归纳,当把这种经验传授给别人时,这种经验对别人来说就是知识。所以,知识是人脑对客观事物的信息沉淀。 技能是人们通过练习而获得的动作方式和系统,例如操作技能中的PS技术、木工技术、电工技术、水工技术等,而能力…

将社会脆弱性纳入高分辨率全球洪水风险绘图

贡献 将高分辨率流洪水模型的年平均超标概率估计值与网格化人口和贫困数据相结合,创建了 90 米分辨率的全球洪水脆弱性调整风险指数(VARI Flood)。该指数提供了国家内部或国家之间相对风险的估计值,并通过识别以高密度和高社会脆弱性为特征的 "热点地区",改变了…

acwing351

https://www.acwing.com/activity/content/problem/content/9051/ NOIP2007提高组T4。本题是加强版。 题目描述 设 \(T=(V, E, W)\) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称 \(T\) 为树网(treenetwork),其中 \(V, E\) 分别表示结点与边的集…

Unity热更学习笔记--AB包的依赖 0.98

AB包的依赖 接上一小结。 在这里我们新建一个红色材质球,赋值给Cube预制体。此时不对材质球进行AB包分类,再次进行打包。运行脚本,发现红色cube成功的从AB包中加载出来。尽管我们没有将cube所依赖的材质球进行打包分类,但是打包时候unity会自动将包中的物体相关依赖打入包中…

Y2 知识和题单

Link。 0x01 进制 引入 计数原理,对于 \(N\) 进制,那么就是逢 \(N\) 进一。 计算机中常用二进制,对应电路中的通电(\(1\))断电(\(0\))。 人类从远古以来使用十进制。 常用的有二进制、三进制、八进制、十进制、十六进制等。 由于不同进制之间数值写法可能相同,在没有特…

Clock Switch,芯片时钟切换的毛刺是什么,如何消除

背景 芯片运行过程中需要时钟切换时,要考虑到是否会产生glitch,小小的glitch有可能导致电路运行的错误。所以时钟切换时需要特别的处理。 直接使用MUX进行时钟切换或者采用如下电路结构进行时钟切换:assign outclock = (clk1 & select) | (~select & clk0);或 assig…