【每日算法 数据结构(C++)】—— 02 | 数组的并交集(解题思路、流程图、代码片段)

news2025/1/10 23:58:49

文章目录

  • 01 | 👑 题目描述
  • 02 | 🔋 解题思路
    • 交集
    • 并集
  • 03 | 🧢 代码片段
    • 交集
    • 并集

在这里插入图片描述

When you feel like giving up, remember why you started.

当你想放弃时,请记住为什么你开始

01 | 👑 题目描述

给你两个数组,请分别求出两个数组的交集和并集

在数学中,我们可以通过交集和并集来描述两个集合之间的关系。

  • 交集(Intersection):指的是两个集合中共有的元素组成的集合。可以用符号 ∩ 来表示。例如,对于集合 A = {1, 2, 3} 和集合 B = {2, 3, 4} 来说,它们的交集就是 {2, 3},因为这些元素同时存在于两个集合中。

  • 并集(Union):指的是将两个集合中所有的元素取并集组成一个新的集合。可以用符号 ∪ 来表示。例如,对于集合 A = {1, 2, 3} 和集合 B = {2, 3, 4} 来说,它们的并集就是 {1, 2, 3, 4},因为它包含了两个集合中的所有元素,且去除了重复的元素。

换句话说,交集是寻找两个集合中相同的元素,而并集则是将两个集合中所有的元素合并在一起。

02 | 🔋 解题思路

上述数学概念同样适用于数组。当我们要找到两个数组的交集时,我们需要找到它们共有的元素。而当我们要找到两个数组的并集时,我们需要将它们中所有的元素合并在一起,并去除重复的元素。

交集

具体解题思路如下

  1. 首先,定义两个数组A和B,分别表示待求交集的数组。
  2. 创建一个空的集合(set)或者哈希集合(unordered_set),用于存储交集的结果。集合是一种数据结构,它只会存储不重复的元素。
  3. 遍历数组A中的每个元素,将其添加到集合中。
  4. 遍历数组B中的每个元素,判断该元素是否存在于集合中。如果存在,则说明它是交集的一个元素,将其添加到另一个集合(结果集合)中。
  5. 最后,将结果集合中的元素转存到数组中,得到最终的交集数组。
  • 时间 && 空间复杂度
    • 时间复杂度

      • 遍历数组A,将元素添加到集合中:O(n),其中n是数组A的大小。
      • 遍历数组B,判断元素是否存在于集合中,并将交集元素添加到结果集合中:O(m),其中m是数组B的大小。

      所以,总体的时间复杂度为O(n + m),我们可以将其简化为O(max(n, m)),其中max(n, m)表示两个数组中较大的大小。

    • 空间复杂度

      • 使用一个集合来存储数组A中的元素:O(n),其中n是数组A的大小。
      • 使用一个结果集合来存储交集元素:最坏情况下,结果集合的大小为min(n, m),其中n和m分别是数组A和数组B的大小。

      所以,总体的空间复杂度为O(n + min(n, m)),我们可以将其简化为O(max(n, m)),其中max(n, m)表示两个数组中较大的大小。

并集

  • 具体的解题流程

    1. 首先,定义两个数组A和B,分别表示待求并集的数组。
    2. 创建一个空的集合(set)或者哈希集合(unordered_set),用于存储并集的结果。集合是一种数据结构,它只会存储不重复的元素。
    3. 遍历数组A中的每个元素,将其添加到集合中。
    4. 遍历数组B中的每个元素,判断该元素是否存在于集合中。如果不存在,则说明它是并集的一个元素,将其添加到集合中。
    5. 最后,将集合中的元素转存到数组中,得到最终的并集数组。
  • 时间 && 空间复杂度

    • 时间复杂度
      将数组A中的元素插入集合:O(n),其中n是数组A的大小。
      遍历数组B,并将元素插入集合:O(m),其中m是数组B的大小。
      因此,总体的时间复杂度为O(n + m),我们可以将其简化为O(max(n, m)),其中max(n, m)表示两个数组中较大的大小
    • 空间复杂度
      创建一个集合来存储并集的结果:O(n + min(n, m)),其中n和m分别是数组A和数组B的大小。 在最坏情况下,如果两个数组没有重复元素,集合的大小为n + m。
      创建一个数组来存储集合中的元素:O(n + min(n, m)),与创建集合的过程相同。
      所以,总体的空间复杂度为O(n + min(n, m)),我们可以将其简化为O(max(n, m)),其中max(n, m)表示两个数组中较大的大小
      因此,整个算法的

03 | 🧢 代码片段

交集

#include <iostream>
#include <unordered_set>
#include <vector>

std::vector<int> intersection(std::vector<int>& A, std::vector<int>& B) {
    std::unordered_set<int> setA(A.begin(), A.end()); // 将数组A中的元素放入集合
    std::unordered_set<int> resultSet;
    
    for (int num : B) {
        if (setA.count(num) > 0) { // 判断num是否存在于集合setA中
            resultSet.insert(num); // 将num添加到结果集合中
        }
    }
    
    std::vector<int> result(resultSet.begin(), resultSet.end()); // 将结果集合转存到数组中
    return result;
}

int main() {
    std::vector<int> A = {1, 2, 3, 4, 5};
    std::vector<int> B = {4, 5, 6, 7, 8};
    
    std::vector<int> result = intersection(A, B);
    
    std::cout << "Intersection: ";
    for (int num : result) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

并集

#include <iostream>
#include <unordered_set>
#include <vector>

std::vector<int> unionSet(std::vector<int>& A, std::vector<int>& B) {
    std::unordered_set<int> resultSet(A.begin(), A.end()); // 将数组A中的元素放入集合

    for (int num : B) {
        resultSet.insert(num); // 将数组B中的元素添加到集合中
    }
    
    std::vector<int> result(resultSet.begin(), resultSet.end()); // 将集合转存到数组中
    return result;
}

int main() {
    std::vector<int> A = {1, 2, 3, 4, 5};
    std::vector<int> B = {4, 5, 6, 7, 8};
    
    std::vector<int> result = unionSet(A, B);
    
    std::cout << "Union Set: ";
    for (int num : result) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

在这里插入图片描述

各位大佬点点关注,点赞,收藏,有空的时候再回来看看,谢谢

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

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

相关文章

学习机组过程中的疑难问题与解决 -----(1)

本文章是在学习计算机组成原理过程中个人感觉需要理解与记忆的问题&#xff0c;还有一些在学习过程中自己产生的疑问以及解答,本文章可能排版不良&#xff0c;精力有限&#xff0c;还请见谅 第一章&#xff1a; &#xff08;1&#xff09;MAR的位数对应着存储单元的个数&#…

前端三剑客简介

文章目录 css的导入方式CSS选择器 JavascriptJavascript的引入方式输出语句变量数据类型javascript对象String对象 BOM对象DOM对象 W3C标准&#xff1a;网页主要由三部分组成 结构&#xff1a;html表现&#xff1a;css&#xff0c;层叠样式表行为&#xff1a;JavaScript css的…

VulnHub项目:Nagini

1、靶机地址&#xff1a; HarryPotter: Nagini ~ VulnHub 本篇为哈利波特死亡圣器系列的第二部&#xff0c;该靶机中存在3个魂器&#xff0c;依次找到它们&#xff0c;摧毁它们&#xff01; 2、渗透过程 首先收集靶机ip和确定攻击机ip&#xff0c;同时探测靶机开放端口 存在…

一个简单案例理解为什么在多线程的应用中要使用互斥锁

需求:使用10个线程,同时对一个值count进行加一操作,每个线程对count加100000次,最终使得count1000000 第一版代码:不加锁 ​​​lock.c #include<stdio.h> #include<pthread.h>#define THREAD_COUNT 10void *thread_callback(void *arg){int *pcount(int*)arg;in…

Unity例子——第一人称视角的角色控制器

本文是为了前文Unity四元组的举例示范&#xff0c;为了让读者更好地理解。 效果是实现一个可以由鼠标进行方向操作&#xff0c;键盘进行移动操作的任务。 此为效果视频&#xff1a; 1687597097844 下面进行教学&#xff1a; 一、搭建简单场景 新建一个场景&#xff0c;放置一…

SonarQube(sonar-scanner)+GitLab(gitlab-runner)实现提交代码自动扫描项目代码

安装gitlab-runner 插件挂载目录 mkdir -p /data/gitlab-runner/configdocker run -d --name gitlab-runner \ -v /data/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart always \ --privilegedtrue \ gitlab/gitlab-r…

【数据库必备知识】索引和事务

数据库系列文章 1. 零基础带你快速上手SQL语言2. 玩转表及其数据3. 上手表设计 4. 索引和事务 目录 &#x1f4d6;前言 1. 索引 1.1 索引的概念 1.2 索引的作用 1.3 索引的使用场景 1.4 索引的使用 1.5 索引背后的数据结构(B树) 2. 事务 2.1 事务的概念 2.2 数据库使…

Centos7安装Python3.10

Centos7用yum安装的Python3版本比较旧&#xff0c;想要安装最新版本的Python3需要自己动手编译安装。下面就来讲讲安装步骤&#xff0c;主要分为这么几个步骤&#xff0c;依赖→下载→编译→配置。另外所有操作都是在root用户下进行。 依赖 编译Python源码需要依赖许多库&…

spring.cache 随笔0 集成设计

0. 最近感觉 “困意驱动睡眠” 也有他的意义 spring cache学习&#xff08;一&#xff09;&#xff1a;spring cache注解简单了解 Java Caching JSR107介绍 同样&#xff0c;本章也会简单的集成redisson作为缓存服务 1. 从我们自己写的javaConfig开始吧 Configuration // 这…

Java——文件操作

文件操作 1、File类概述2、File类的常用APIFile类的判断文件类型、获取文件信息功能创建文件、删除文件功能遍历文件夹文件搜索 3、字符集常见字符集字符集的编码、解码操作 4、IO流分类5、字节流的使用文件字节输入流文件字节输出流文件拷贝 6、字符类的使用文件字符输入流文件…

“前端已死”

一、一些迹象 逛社区&#xff0c;偶然看到了这张图片&#xff1a; 嗯……我眉头一皱&#xff0c;久久不语&#xff0c;心想&#xff0c;有这么夸张吗&#xff0c;假的吧&#xff1f; 突然想到&#xff0c;最近我在社区发了个前端招聘的信息&#xff0c;结果简历漫天纷飞&…

【C++】auto_ptr为何被唾弃?以及其他智能指针的学习

搭配异常可以让异常的代码更简洁 文章目录 智能指针 内存泄漏的危害 1.auto_ptr(非常不建议使用) 2.unique_ptr 3.shared_ptr 4.weak_ptr总结 智能指针 C中为什么会需要智能指针呢&#xff1f;下面我们看一下样例&#xff1a; int div() {int a, b;cin >&g…

图表制作办公首选--实用图表工具Echars

实用图表工具Echars 前言 由于工作的需要&#xff0c;在写材料的时候需要使用到柱状图、饼状图、折线图等等展示数据&#xff0c;可以使用PPT等办公软件构建出图表&#xff0c;在这里可以使用更加方便、更加美观的工具Echars。 Echars图表使用 Echars官网&#xff1a;Ecahr…

二叉平衡树之红黑树

目录 1.概念 2.性质 3.节点的定义 4.插入 1.按照二叉搜索树规则插入结点 2.调整颜色 1.uncle存在且为红色 2.uncle不存在或者为黑 cur为 3.根节点改为黑色 5.验证 6.比较 7.应用 1.概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存…

【计算机网络】计算机网络期末自测题(一)

目录 一、 填空题&#xff1a;(20 分&#xff0c;每空 1 分) 二、 选择题(20 分&#xff0c;每小题 1 分) 三、不定项选择题 (10 分&#xff0c;每小题 1 分) 四、名词解释 (15 分&#xff0c;每小题 3 分) 五、简答题 (25 分) 得分 一、 填空题&#xff1a;(20 分&#xff…

【C++】STL——string类详解

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

混合策略改进的哈里斯鹰优化算法-附代码

混合策略改进的哈里斯鹰优化算法 文章目录 混合策略改进的哈里斯鹰优化算法1.哈里斯鹰优化算法2.改进哈里斯鹰优化算法2.1 初始化种群的改进2.1.1 初始种群多样化2.1.2 初始种群精英化 2.2 逃逸能量递减机制的改进2.4 拉普拉斯交叉算子策略 3.实验结果4.参考文献5.Matlab代码6.…

6.17 、Java初级:锁

1 同步锁 1.1 前言 经过前面多线程编程的学习,我们遇到了线程安全的相关问题,比如多线程售票情景下的超卖/重卖现象. 上节笔记点这里-进程与线程笔记 我们如何判断程序有没有可能出现线程安全问题,主要有以下三个条件: 在多线程程序中 有共享数据 多条语句操作共享数据 多…

移动web-渐变

渐变 使用场景&#xff1a;使用background-image属性实现渐变背景效果 代码&#xff1a;background-image: linear-gradient(参数1,参数2,参数3...); (默认的方位从上到下) 参数1 方位名词: to right, to left 角度deg: 直接写度数 参数2 颜色1 参数3 颜色2... 注意&#xff…

看完这篇 教你玩转渗透测试靶机vulnhub—Corrosion:1

Vulnhub靶机Corrosion:1渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a; Vulnhub靶机渗透总结&#xff1a; Vulnhub靶机介绍&#xff1a; vulnhub是个提…