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

这篇具有很好参考价值的文章主要介绍了【每日算法 && 数据结构(C++)】—— 02 | 数组的并交集(解题思路、流程图、代码片段)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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

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. 最后,将结果集合中的元素转存到数组中,得到最终的交集数组。

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

  • 时间 && 空间复杂度
    • 时间复杂度

      • 遍历数组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. 最后,将集合中的元素转存到数组中,得到最终的并集数组。

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

  • 时间 && 空间复杂度
    • 时间复杂度
      将数组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;
}

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

并集

#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;
}

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

【每日算法 && 数据结构(C++)】—— 02 | 数组的并交集(解题思路、流程图、代码片段)文章来源地址https://www.toymoban.com/news/detail-504934.html

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

到了这里,关于【每日算法 && 数据结构(C++)】—— 02 | 数组的并交集(解题思路、流程图、代码片段)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读程序员的制胜技笔记02_算法与数据结构

    3.1.1.1. 根据你的需要,可以有更智能的算法 3.1.3.1. 算法本身并不意味着它很聪明 3.2.1.1. public static bool Contains(int[] array, int lookFor) { for (int n = 0; n < array.Length; n++) {        if (array[n] == lookFor) {            return true;        }    }    return false; } 3.3.1.1. public sta

    2024年02月06日
    浏览(47)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(一)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 树状数组 (Binary Indexed Tree,BIT)是一种数据结构,用于高效地处理

    2024年03月11日
    浏览(51)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(二)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法、数据结构~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 数据结构各内部排序算法总结对比及动图演示(插入排序

    2024年03月26日
    浏览(75)
  • 数据结构与算法 | 数组(Array)

    数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。 数组索引(Index): 数组中的每个元素都有一个唯一的整数索引,从0开始计数。索引用于访问数组中的元素

    2024年02月08日
    浏览(35)
  • 数据结构与算法(一): 稀疏数组

    在五子棋游戏或类似的游戏中,我们可以把整个棋盘想象成是一个有规律的二维数组,其值由0、1、2三个数字组成,0代表空白区域,1代表白子,2代表黑子。这种情况:即当一个数组中大部分元素为0或者为同一值时,存储该数组数据可以使用稀疏数组来对原始数组进行精简,

    2024年02月11日
    浏览(35)
  • JavaScript数据结构与算法整理------数组

            数组的标准定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量 ,几乎所有的编程语言都有类似的数据结构,而JavaScript的数组略有不同。         JavaScript中的数组是一种特殊的对象,用来表示偏

    2023年04月24日
    浏览(47)
  • 【数据结构和算法】寻找数组的中心下标

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列长度 2.1.4 寻找数组中第 k 小的元素 2

    2024年02月04日
    浏览(38)
  • 数据结构与算法-数组(附阿里面试题)

            给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄   有多少人?          给定机器为 单台+2CPU+2G内存。不得使用现成的容器,比如map等。 (这一句可以忽略)         在以上情况下你该如何以最高效的方法来解决这个

    2024年02月13日
    浏览(28)
  • 【数据结构和算法】使用数组的结构实现链表(单向或双向)

    上文我们通过结构体的结构实现了队列 、以及循环队列的实现,我们或许在其他老师的教学中,只学到了用结构体的形式来实现链表、队列、栈等数据结构,本文我想告诉你的是,我们 可以使用数组的结构实现链表、单调栈、单调队列 目录 前言 一、用数组结构的好处 1.数

    2024年01月20日
    浏览(51)
  • 【数据结构与算法——TypeScript】数组、栈、队列、链表

    解决问题 的过程中,不仅仅 数据的存储方式会影响效率,算法的优劣也会影响效率 什么是算法? 定义: 🟢 一个有限指令集,每条指令的描述不依赖于言语 (编写指令:java/c++/ts/js) 🟢 接收一些输入(有些情况下不需要输入)(接收:排序:无序数组) 🟢 产生输出 (

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包