349. 两个数组的交集(力扣LeetCode)

news2024/11/18 11:47:08

文章目录

  • 349. 两个数组的交集
    • 题目描述
    • 数组解题
    • set容器解题
      • 该思路数组版解题

349. 两个数组的交集

题目描述

给定两个数组 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

数组解题

思路是使用两个辅助数组 a 和 b 来跟踪每个数组中哪些数字出现过。由于题目提示中给出的数字范围是 0 <= nums1[i], nums2[i] <= 1000,这两个数组的大小被设置为1000,对应可能存在的最大数字。

代码中的第一个for循环遍历数组 nums1,并在辅助数组 a 中对应的位置标记为1,表示这个数字出现过。同样的方法也应用于 nums2 和辅助数组 b。

之后,使用第三个for循环检查 a 和 b 中的每一个元素。如果两个数组在同一个索引位置上都标记了1,则意味着该数字在两个输入数组中都出现过,即它们的交集,因此将其添加到结果向量 nums3 中。

最终,nums3 包含了所有在两个输入数组中都出现过的唯一数字,即它们的交集,这个向量将被作为结果返回。

这段代码的理论执行时间复杂度为 O(n),其中 n 是输入数组中元素个数的上限(这里是1000)。实际的时间复杂度取决于输入数组 nums1 和 nums2 的真实大小。空间复杂度是 O(m),其中 m 是可能的数字范围的上限(在这个例子中是1000)。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // 声明两个大小为1000的数组来记录两个输入数组中元素的存在情况
        // 初始化为0
        int a[1000] = {0}, b[1000] = {0};
        
        // 遍历第一个数组nums1
        for(int i = 0; i < nums1.size(); i++)
            // 将数组a对应位置标记为1,表示nums1中存在该元素
            a[nums1[i]] = 1;
        
        // 遍历第二个数组nums2
        for(int i = 0; i < nums2.size(); i++)
            // 将数组b对应位置标记为1,表示nums2中存在该元素
            b[nums2[i]] = 1;
        
        // 声明一个向量nums3,用于存储交集元素
        vector<int> nums3;
        
        // 遍历数组a和b
        for(int i = 0; i < 1000; i++) {
            // 如果某个元素在两个数组中都存在,则将其加入到nums3
            if(a[i] == 1 && b[i] == 1)
                nums3.push_back(i);
        }
        
        // 返回包含交集的向量
        return nums3;
    }
};

set容器解题

这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。

注意题目特意说明:输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序

如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构:

  • std::set
  • std::multiset
  • std::unordered_set

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

思路如图所示:
在这里插入图片描述

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // 使用 unordered_set 来存储最终的交集结果,unordered_set 自动去重
        unordered_set<int> result;

        // 将 nums1 转换成 unordered_set,以便快速查找
        // 这里通过范围构造函数直接将 nums1 中的所有元素初始化到 set 中
        unordered_set<int> num(nums1.begin(), nums1.end());

        // 遍历 nums2
        for(int n : nums2) {
            // 使用 find 方法检查当前元素 n 是否存在于 nums1 的集合中
            // 如果存在,则说明 n 是 nums1 和 nums2 的交集中的一个
            if(num.find(n) != num.end())
                // 将 n 插入结果集合中,如果 n 已经存在,则不会重复插入
                result.insert(n);
        }

        // 将最终的交集结果转换成 vector 并返回
        // 这里也是通过范围构造函数,将 result 集合中的所有元素初始化到新的 vector 中
        return vector<int> (result.begin(), result.end());
    }
};

  • set.find() ,返回给定值值得定位器,如果没找到则返回end()。
if(num.find(n) != num.end())//只要不等于end()就代表找到了

该思路数组版解题

代码的执行流程是这样的:

  1. 声明一个 unordered_set result,用于存储交集,且自动去重。
  2. 创建一个大小为 1000 的数组 a,用于标记 nums1 中出现的元素。这里假设元素值不会超过 1000,根据题目提示,这是一个安全的假设。
  3. 遍历 nums1,对于 nums1 中的每个元素,将 a 数组对应索引处的值设置为 1。
  4. 遍历 nums2,对于 nums2 中的每个元素,检查 a 数组中相同值的索引位置是否被标记为 1(也就是检查是否在 nums1 中出现过)。
  5. 如果检查结果为 true(即 a[n] 等于 1),则将 n 添加到 result 集合中。
  6. 最后,将 result 集合中的元素转换为 vector 并返回作为最终结果。
    由于 unordered_set 是基于哈希表的,因此插入和查找的平均时间复杂度是 O(1)。该算法的总体时间复杂度是 O(n + m),其中 n 和 m 分别是 nums1 和 nums2 的长度。空间复杂度是 O(n),其中 n 是两数组中不同元素的数量。
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // 创建一个 unordered_set 来存储交集的结果,自动去重保证元素唯一
        unordered_set<int> result;
        
        // 创建一个大小为1000的数组来记录元素是否存在于 nums1 中
        // 数组初始化为0,表示没有任何元素
        int a[1000] = {0};

        // 遍历 nums1,将存在的元素在数组 a 中对应位置标记为1
        for(int i = 0; i < nums1.size(); i++)
            a[nums1[i]] = 1;

        // 遍历 nums2
        for(int n : nums2) {
            // 如果当前元素在数组 a 中被标记为1(即出现在 nums1 中)
            // 则将其添加到结果集合中
            if(a[n] == 1)
                result.insert(n);
        }

        // 将 unordered_set 转换为 vector 并返回
        // 这里使用范围构造函数,将 result 中的所有元素初始化到新的 vector 中
        return vector<int>(result.begin(), result.end());
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Linux下多线程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 前置&#xff1a;进程地址空间和页表1.1 如何看待进程地址空间和页表1.2 虚拟地址…

练习12.6_横向射击_Python编程:从入门到实践(第3版)

编写一个游戏&#xff0c;将一艘飞船放在屏幕左侧&#xff0c;并允许玩家上下移动飞船。在玩家按空格键时&#xff0c; 让飞船发射一颗在屏幕中向右飞行的子弹&#xff0c;并在子弹从屏幕中消失后将其删除。 ship_shooting.py import pygame import sys from leftship impor…

​ArcGIS Pro 如何批量删除字段

在某些时候&#xff0c;我们得到的图层属性表内可能会有很多不需要的字段&#xff0c;如果挨个去删除会十分的麻烦&#xff0c;对于这种情况&#xff0c;我们可以使用工具箱内的字段删除工具批量删除&#xff0c;这里为大家介绍一下使用方法&#xff0c;希望能对你有所帮助。 …

[C++历练之路]C++中的继承小学问

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; C中&#xff0c;继承是一种面向对象编程的重要概念&#xff0c;它允许一个类&#xff08;子类/派生类&#xff09;从另一个类&#xff08;父类/基类&#xff09;继承属性和方法。继承是…

C语言系列-整数在内存中的存储大小端字节序

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 整数在内存中的存储 大小端字节序和字节序判断 什么是大小端 为什么会有大小端 练习 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下面的内容 整数的2…

HashMap基本使用

特点&#xff1a; ①HashMap是Map里面的一个实现类。②没有额外需要学习的特有方法&#xff0c;直接使用Map里面的方法就可以了。③特点都是由键决定的&#xff1a;无序、不重复、无索引④HashMap跟HashSet底层原理是一模一样的&#xff0c;从名字可以看出来&#xff0c;都是哈…

MySQL原理(一)架构组成(2)逻辑模块组成

总的来说&#xff0c;MySQL可以看成是二层架构&#xff0c;第一层我们通常叫做SQL Layer&#xff0c;在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的&#xff0c;包括权限判断&#xff0c;sql解析&#xff0c;执行计划优化&#xff0c;query cache的处理等等&…

麒麟系统—— openKylin 安装 Nacos

麒麟系统—— openKylin 安装 Nacos 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。2. 确保 java 已经安装完毕3. 确保 Maven 已经安装完毕 二、下载 nacos三、解压与运行解压 关于 nacos 配置 本文将分享如何在麒麟系统 openKylin 上安装 Nacos。 一、准备工作 1. …

深度学习之卷积神经网络

卷积神经网络简称为CNN 首先我们来回顾一下&#xff0c;我们之前学到的全连接的神经网络&#xff1a; 上面我们通过线性层串行连接起来的神经网络&#xff0c;我们叫做全链接的网络&#xff0c;在线性层里面&#xff0c;我们的输入值和任意的输出值之间都存在权重&#xff0c;…

《HTML 简易速速上手小册》第10章:HTML 的维护与优化(2024 最新版)

文章目录 10.1 网页性能优化10.1.1 基础知识10.1.2 案例 1&#xff1a;优化网页图像10.1.3 案例 2&#xff1a;使用延迟加载优化性能10.1.4 案例 3&#xff1a;优化 CSS 和 JavaScript 的加载 10.2 SEO 最佳实践10.2.1 基础知识10.2.2 案例 1&#xff1a;创建一个 SEO 友好的博…

伊恩·斯图尔特《改变世界的17个方程》毕达哥拉斯定理笔记

它告诉我们什么&#xff1f; 直角三角形的三个边之间有什么关系。 为什么重要&#xff1f; 它提供了几何和代数之间的重要联系&#xff0c;使我们能够根据坐标计算距离。它也催生出了三角学。 它带来了什么&#xff1f; 测绘、导航&#xff0c;以及较近代出现的狭义和广义相对论…

深入了解Matplotlib中的子图创建方法

深入了解Matplotlib中的子图创建方法 一 add_axes( **kwargs):1.1 函数介绍1.2 示例一 创建第一张子图1.2 示例二 polar参数的运用1.3 示例三 创建多张子图 二 add_subplot(*args, **kwargs):2.1 函数介绍2.2 示例一 三 两种方法的区别3.1 参数形式3.2 布局灵活性3.3 适用场景3…

基于YOLOv8的摄像头吸烟行为检测系统(Python源码+Pyqt6界面+数据集)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了摄像头下吸烟行为检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Pytorch的源码、训练数据集以及PyQt6的UI界面。在界面中可以选择各种图片、视频进行检测识别&#xff0c;可进行置信度、Iou阈值设定…

【linux】磁盘空间不足-常用排查和处理命令

【linux】磁盘空间不足-常用排查和处理命令 1.通查一下 df -h #查看服务器磁盘空间情况 du -hs * 2>/dev/null #列出各目录所占空间大小 或 du -h -d 1 2>/dev/null #列出各目录所占空间大小 1.1情况一 df 磁盘空间和du 目录空间占用相等&#xff0c…

离线安装nginx_银河麒麟系统_nginx报错_503_500 Internal Server Error----nginx工作笔记007

如果报这个错误,意思就是,对于nginx.conf文件中指定的,文件夹没有权限 那么这个是去给对应的文件夹赋权限: chmod 777 /opt/module/test_web 就可以了,然后再去访问就不会报错了,还有 503的错误都可以这样解决 然后关于离线安装nginx,尝试了一下如果把之前安装过的nginx,直接…

app逆向-frida定位签名校验

文章目录 一、前言二、如何实现签名校验三、案例&#xff1a;定位签名校验 一、前言 当我们说应用签名校验时&#xff0c;实际上是一种安全机制&#xff0c;用于确保移动应用在被安装和运行时没有被篡改或修改。这个机制通过在应用程序文件上附加一种数字签名的方式来实现。 …

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; GWCA -CNN-BiLSTM-Attention长城建造算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 长城建造算法&#xff08;Great Wall Construction Algorithm&#xff0c;GWC…

Centos Cron设置定时任务

这本是很简单的问题&#xff0c;但是我服务器重装系统两次&#xff0c;遇到的问题都不一样&#xff0c;所以记录一下 1.首先要确保服务器上有 cron 服务 sudo systemctl status crond2.设置时区 sudo timedatectl set-timezone Asia/Shanghai3.重启crond 服务使crond服务的时…

指针的深入理解(一)

这一节主要复习数组指针&#xff0c;int (* )[ ] 就是数组指针类型的标志。 因为有&#xff08;&#xff09;将*括起来&#xff0c;所以&#xff08;*&#xff09;表示一个指针。[ ] 表示数组&#xff0c;所以&#xff08;*&#xff09;[ ]就表示一个指向数组的指针&#xff…

【C++】I/O多路转接详解(一)

目录 1. 背景引入1.1 IO的过程1.2 五种IO模型1.2.1 阻塞IO1.2.2 非阻塞IO1.2.3 信号驱动IO1.2.4 IO多路转接1.2.5 异步IO 1.3 同步通信 与 异步通信1.4 阻塞 与 非阻塞1.4.1 阻塞与非阻塞区别1.4.2 设置非阻塞IO 2. select2.1 接口使用2.2 select执行过程2.3 select代码实践 3.…