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

[LeetCode]day17 349.两个数组的交集

https://leetcode.cn/problems/intersection-of-two-arrays/description/

题目描述

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

解法一:暴力解法

最容易想到的就是使用双重循环遍历两个数组,发现有相同元素并且结果数组中没有重复的元素时,就加入结果数组中

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int>re;
        for(int i=0;i<nums1.size();i++){
            for(int j=0;j<nums2.size();j++){
                if(nums1[i]==nums2[j]&&(find(re.begin(),re.end(),nums1[i])==re.end())){
                    re.push_back(nums1[i]);
                }
            }
        }
        return re;
    }
};

时间复杂度为 O ( n ) = n 2 O(n)=n^2 On=n2


解法二:使用哈希表

上一篇我们提到过,当需要查询一个数据是否存在于某个集合中时,要先想到使用哈希表

使用数组

由于这道题中,数组中的数据最大为1000,我们可以考虑使用数组
数组的下标对应了每一个数字

  • 用set来作为结果数组,因为set本身数据是不可重复的
  • 遍历nums1 比如说遍历到5 就将hash[5]改为1
  • 遍历nums2 比如说遍历到5 去查找hash[5]是否为1 如果为1,说明num2和nums1中都有这个数 如果并且re数组中没有5,就将它放入结果数组中
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
       unordered_set<int>re;
       int hash[1001]={0};
     for(int i=0;i<nums1.size();i++){
        hash[nums1[i]]=1;
     }
     for(int i=0;i<nums2.size();i++){
        if(hash[nums2[i]]==1){
            re.insert(nums2[i]);
        }
     }
       return vector<int>(re.begin(),re.end());
    }
};

使用set

如果数据更大一些,就可以考虑使用set 其中unordered_set查询效率比较高

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
       unordered_set<int>re;
       unordered_set<int>hash;
     for(int i=0;i<nums1.size();i++){
        hash.insert(nums1[i]);
     }
     for(int i=0;i<nums2.size();i++){
       if(hash.find(nums2[i])!=hash.end()&&re.find(nums2[i])==re.end()){
        re.insert(nums2[i]);
       }
     }
       return vector<int>(re.begin(),re.end());
    }
};

使用哈希表 时间复杂度 O ( n ) = m + n O(n)=m+n O(n)=m+n


http://www.kler.cn/a/538398.html

相关文章:

  • 如何搭建DeepSeek R1的训推环境?
  • 2025.1.8(qt图形化界面之消息框)
  • 元宇宙中的隐私与数据保护:Facebook 的挑战与机遇
  • 疯狂前端面试题(二)
  • Linux系统命令无法使用(glib库相关问题)
  • 浅谈 HashMap 的扩容过程和 put 过程
  • 云计算架构师的学习成长路线
  • [C 语言篇】数据在内存中的存储
  • 2025牛客寒假算法基础集训营4(补题)
  • Swipe横滑与SwipeItem自定义横滑相互影响
  • 双向链表、内核链表和gdb(20250208)
  • Linux之kernel(1)系统基础理论(1)
  • FreeRTOS的事件组
  • 协议-RK-Gstreamer
  • 07苍穹外卖之redis缓存商品、购物车(redis案例缓存实现)
  • 【Windows】PowerShell 缓存区大小调节
  • LMM-3DP:集成 LMM 规划器和 3D 技能策略实现可泛化操作
  • 深入剖析 JVM 垃圾收集器之 CMS 和 G1
  • Golang:精通sync/atomic 包的Atomic 操作
  • 本地计算机上的MySQL80服务启动后停止某些服务在未由其他服务或程序使用时将自动停止(不需要清除数据)
  • 今日写题work
  • Https握手过程 (面试题)
  • PMP–一、二、三模–分类–13.干系人管理
  • Python关键字全解析与实例应用
  • python Excel 表读取合并单元格以及清除空格符
  • #渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞