Leetcode刷题-349:两个数组的交集

本文介绍了如何解决LeetCode上的349题——找到两个数组的交集。提供了通过哈希集合和排序+双指针两种解题方法,并详细解析了每种方法的思路及实现过程,强调了哈希集合在处理此类问题时的优势以及排序后双指针的效率。
摘要由CSDN通过智能技术生成

1.题目描述

给定两个数组 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] 也是可通过的

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays

2.题目分析

2.1 通过哈希集合解题

  • 我们这里要计算的是两个数组的交集,最容易想到的的方法就是先遍历数组 nums1,然后再查询其中的每个元素是否存在于nums2中,如果存在,则将该元素添加到返回值。
  • 这样我们很容易就会想到使用一个辅助数组存储已经在nums1遍历到的值,然后再查看在nums2中的元素是否已经存在于辅助数组,若存在则将该元素添加到结果数组。但是我们会面临一个问题,那就是这样用辅助数组进行存储的话,不仅数组的大小无法确定,而且数组的值十分分散且不容易查找,这就会造成 空间的极大浪费和操作的不便。
  • 所以我们需要一种可以快速进行确定某个元素是否存在、大小不受限制的数据结构进行存储辅助数组,这样我们就想到了使用unordered_set 来存储辅助数据。

这样我们就得出以下解题步骤

  1. 首先初始化一个名为uSetunordered_set来进行存储在nums1中已经遍历到的值。
  2. 遍历nums1,每当遍历到一个元素就将其添加到uSet
  3. 遍历nums2,每当遍历到一个元素就查看其是否在uSet中存在,若存在则将其存储到另一个结果unordered_set中;
  4. 用结果unordered_set初始化一个vector数组并返回。

2.2 排序+双指针

那么,我们是否可以直接比较数组进行查找交集呢,我们尝试一下。一般而言,经过排序的数组是更加容易进行比较的,所以我们首先对数组进行排序,这时数组就有了规律,我们总是可以很容易从头到尾的查找两个数组的相同元素。具体就是两个数组nums1nums2分别使用一个工作指针i和j,当二者指向的元素相同时就将其加入结果vector数组,否则就对指向较小元素的指针进行移动。
上述流程描述起来十分简单,但是在实现时我们需要注意数组元素是可能重复的,但是输出结果要求是不重复的,所以我们要对遍历到的数组进行去重。具体的去重方法分为以下两种:

  • 在对数组nums1nums2的指针移动中进行去重:这个就是每次在判断两个指针指向的值相等时需要对指针进行同时迁移,所以为了避免重复就要判断i和j指针在迁移后指向的元素是否和前一个元素相等,若相等则继续进行移动。代码见3.2。可以与前面的第15题——三数之和作类比。
  • 在进行vector结果数组的值插入时进行判断去重:就是在每次得到一个可更新进vector的数值时判断这个数值是否已经被插入在尾部决定是否将其更新。

3.题目解答

3.1 哈希集合解法

class Solution {
   
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
   		
    	//保存返回结果的set
        unordered_set<int> result_set;
        //保存中间结果的set
        unordered_set<int> uSet(nums1.begin(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值