当前位置: 首页 > news >正文

Leetcode刷题 由浅入深之哈希表——349. 两个数组的交集

目录

(一)数组交集的C++实现

写法一(哈希暴力搜索)

写法二(哈希集合搜索)

(二)复杂度分析

时间复杂度

空间复杂度

(三)总结


【题目链接】349.两个数组的交集 - 力扣(LeetCode)

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

(一)数组交集的C++实现

哈希表:对元素的值进行哈希映射(哈希函数),映射到对应下标位置。也就是已知一个值,经过哈希函数可以直接计算在哈希表中的存储位置。

        哈希表的特点:元素值不重复,下标可以直接访问元素。

        哈希表的作用:使用哈希表可以快速(直接根据值和哈希函数计算下标并访问)判断元素是否在表里,时间复杂度为O(1)

写法一(哈希暴力搜索)

解题思路:

        双重遍历实现比较,并将交集结果存入哈希表中。返回时,需要将哈希表转化为整型数组。

(借助哈希表就不需要再考虑重复插入的问题

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> hashlist;    //哈希表的定义for(auto i : nums1){for(auto j : nums2){if(i == j)hashlist.insert(i);    //哈希表的插入操作}}return vector<int> (hashlist.begin(), hashlist.end());    //返回整个哈希表构成的数组}
};

写法二(哈希集合搜索)

解题思路:

        借助数学中寻找集合交集的思想,可以先将一个数组nums1变成具有集合特点的数组存储(也就是存储在一个哈希表中)。接着,可以遍历另一个数组nums2,如果元素在哈希表中,则将该值添加到交集数组中并在哈希表中删除;如果不在,则不需要进行任何操作。

        这种办法时间复杂度更低,不需要遍历完两个数组的所有元素。

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> hashlist;    //定义整形哈希表vector<int> result;    //定义整形数组(存储交集结果)for(auto i : nums1)hashlist.insert(i);for(auto j : nums2)if(hashlist.find(j) != hashlist.end()){    //不为hashlist.end()说明哈希表hashlist中有j这个值result.push_back(j);    //写进数组hashlist.erase(j);    //删除哈希表中的j这个值}return result;}
};

(二)复杂度分析

时间复杂度

(1)写法一:两层嵌套循环,假设nums1的长度为mnums2的长度为n,那么比较的次数为m * nset的插入操作平均时间复杂度是O(logk),其中kset中元素的数量。在最坏情况下,插入操作的总时间复杂度为O(mnlog(mn)) 。因此,总的时间复杂度为O(mnlog(mn))

(2)写法二:第一个循环插入操作平均时间复杂度是O(logm),插入m个元素的总时间复杂度为O(mlogm)。第二个循环遍历nums2,对于nums2中的每个元素,执行查找操作和可能的删除操作,查找和删除操作的平均时间复杂度都是O(logm),因此第二个循环的总时间复杂度为O(nlogm)。所以,总的时间复杂度为O(mlogm+nlogm)

空间复杂度

(1)写法一:set用来存储交集元素,在最坏情况下,交集元素的数量可能达到min(m, n),因此set所占用的空间为O(min(m,n));返回的vector也需要O(min(m,n))。所以,总的空间复杂度为O(min(m,n))

(2)写法二:set用来存储nums1中的元素,在最坏情况下,需要O(m)的空间。result数组用来存储交集元素,在最坏情况下,交集元素的数量可能达到min(m, n),因此result数组需要O(min(m,n))的空间。所以,总的空间复杂度为O(m)

(三)总结

(1)哈希表可以快速判断元素是否在表里,相比于遍历搜索时间复杂度会更低。

(2)解题时多找一下数学规律。

学习中,诚挚希望有心者指正和交流,经验或者方法都可。

相关文章:

  • 一级指针的介绍
  • 如何使用Labelimg查看已经标注好的YOLO数据集标注情况
  • webgl入门实例-12WebGL 投影矩阵 (Projection Matrix)基本概念
  • 电子级化学品除杂的必要性
  • java线程池原理及使用和处理流程
  • 【AI部署】腾讯云GPU-常见故障—SadTalker的AI数字人视频—未来之窗超算中心 tb-lightly
  • ESP8266简单介绍
  • cpolar 内网穿透 实现公网可以访问本机
  • 智能体时代的产业范式确立,中国企业以探索者姿态走出自己的路
  • 【卡洛诗】成为平价市场中的标杆西餐厅
  • 守护进程编程、GDB调试以及外网连接树莓派
  • 关于@Scheduled注解的参数
  • NOIP2015提高组.信息传递
  • 工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)
  • AI象棋 3.0 |AI自动下象棋工具,破译残局,自动帮助下棋,内置视频教程
  • `peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么
  • 跟我学C++中级篇——内存异常的分析
  • 自注意力机制self-attention
  • C++智能指针的知识!
  • 【HDFS入门】联邦机制(Federation)与扩展性:HDFS NameNode水平扩展深度解析
  • 用户称被冒用身份证异地办卡申请注销遭拒,澎湃介入后邯郸联通着手办理剥离
  • 福特预期6月美国市场涨价,机构称加税让每辆汽车成本至少增加数千美元
  • 亚太峰会上哪个词最火?我们问了问AI
  • 公安部道研中心:虚假宣传自动驾驶致严重后果,责任人或处2年以下刑期
  • 国际油价大跳水联动,国内汽油价格迎三年来最大跌幅
  • 碳市场扩围推动汽车行业降碳,用真实碳数据量化成本是关键