(哈希表 ) 349. 两个数组的交集 ——【Leetcode每日一题】

news2024/11/25 0:31:38

❓349. 两个数组的交集

难度:简单

给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

示例 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

💡思路:

法一:排序+双指针

如果两个数组是有序的,则可以使用双指针的方法得到两个数组的交集。

  • 首先对两个数组进行排序
  • 然后使用两个指针遍历两个数组。可以预见的是加入答案的数组的元素一定是递增的;
  • 为了保证加入元素的唯一性,我们在向结果数组ans 添加元素时,要判断该元素是否已经存在(如果ans添加第一个元素时,不需要判断)。

法二:哈希表

输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的,根据哈希表的性质可以去重:

  • 首先将 num1 中的元素放到哈希表 s1 中;
  • 然后遍历 num2 中元素,如果 s1 中也存在,则保存到另一个哈希表 ans 中;
  • 最后哈希表 ans 就是所求交集,将结果集合转为数组。

🍁代码:(Java、C++)

法一:排序+双指针
Java

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int len1 = nums1.length, len2 = nums2.length;
        int[] ans = new int[Math.min(len1, len2)];
        int index1 = 0, index2 = 0, index = 0;
        while(index1 < len1 && index2 < len2){
            if(nums1[index1] == nums2[index2]){
                if(index == 0){
                    ans[index++] = nums1[index1];
                }else if(nums1[index1] != ans[index - 1]){
                    ans[index++] = nums1[index1];
                }
                index1++;
                index2++;
            }else if(nums1[index1] < nums2[index2]){
                index1++;
            }else{
                index2++;
            }
        }
        return Arrays.copyOfRange(ans, 0, index);
    }
}

C++

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        vector<int> ans;
        vector<int>::iterator ite1 = nums1.begin(), ite2 = nums2.begin();
        while(ite1 != nums1.end() && ite2 != nums2.end()){
            if(*ite1 == *ite2){
                if(ans.size() == 0){
                    ans.push_back(*ite1);
                }else if(*ite1 != ans.back()){
                    ans.push_back(*ite1);
                }
                ite1++;
                ite2++;
            }else if(*ite1 < *ite2){
                ite1++;
            }else{
                ite2++;
            }
        }
        return ans;
    }
};

法二:哈希表
Java

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> s1 = new HashSet<Integer>();
        Set<Integer> ans = new HashSet<Integer>();
        for(int num : nums1){
            s1.add(num);
        }
        for(int num: nums2){
            if(s1.contains(num)){
                ans.add(num);
            }
        }
        //将结果集合转为数组, 另外申请一个数组存放setRes中的元素,最后返回数组
        int[] arr = new int[ans.size()];
        int j = 0;
        for(int i : ans){
            arr[j++] = i;
        }
        
        return arr;
    }
}

C++

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> s(nums1.begin(), nums1.end());
        unordered_set<int> ans;
        for(int num : nums2){
            if(s.find(num) != s.end()){
                ans.insert(num);
            }
        }
        return vector<int>(ans.begin(), ans.end());;
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度:法一: O ( m   l o g m + n   l o g n ) O(m \ log m+n \ log n) O(m logm+n logn),其中 mn 分别是两个数组的长度。对两个数组排序的时间复杂度分别是 O ( m log ⁡ m ) O(m \log m) O(mlogm) O ( n log ⁡ n ) O(n \log n) O(nlogn),双指针寻找交集元素的时间复杂度是 O ( m + n ) O(m+n) O(m+n)。法二为: O ( m + n ) O(m + n) O(m+n)
  • 空间复杂度:法一: O ( l o g m + l o g n ) O( log m+ log n) O(logm+logn),其中 mn 分别是两个数组的长度 , 空间复杂度主要取决于排序使用的额外空间。法二为: O ( n ) O(n) O(n)n 为两数组长度的最小值。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

Hbase学习笔记

1 HBase介绍 (1) HBase是什么 HBase是一个开源的非关系型分布式、实时数据库(Nosql)&#xff0c;运行于HDFS文件系统之上&#xff0c;因此key容错地存储海量稀疏的数据。 海量稀疏就是说不能保证每一个key它的列都有value。 关系型数据库&#xff1a;mysql、oracle 非关系…

Midjourney AI绘画咒语与生成的作品(实例)

据说Midjourney出来后&#xff0c;有一大批设计师抱着电脑&#xff0c;哭晕了~~ 有兴趣的朋友&#xff0c;可以看一下我前两天发的&#xff0c;地址如下&#xff1a; Midjourney AI绘画中文教程详解&#xff08;完整版&#xff09;模型、命令、参数与各种高级用法https://blog…

马斯洛的的五层需求完美吗 不

马斯洛五层需求难道就很完美吗&#xff1f;不&#xff01; 我很佩服的复旦大学哲学王德峰教授批判 对马斯洛的自我实现&#xff0c;他认为 中国人没有西方意义上的自我实现 比如儒家成人达己、圆满、道问学和尊德性&#xff0c;比如孔子的学生颜回 比如佛家的渡人、觉悟。比如弘…

使用sklearn进行机器学习案例(1)

文章目录 案例一. 加州房价预测案例二. MNIST手写数字识别案例三. 波士顿房价预测 案例一. 加州房价预测 线性回归通过对训练集进行训练&#xff0c;拟合出一个线性方程&#xff0c;使得预测值与实际值之间的平均误差最小化。这个过程可以使用梯度下降法等优化算法来实现。即通…

使用curl命令传输数据

文章目录 一、curl命令二、举例和注意事项Reference 一、curl命令 curl是传输数据的命令行工具&#xff0c;可以通过命令行发送HTTP请求和接收HTTP响应。它的名字是“client for URLs”&#xff0c;意为URL的客户端&#xff0c;表示该工具主要用于处理URL相关的任务。curl可以…

Mysql数据库对表的基本操作

一.表基本操作 1.当前数据库内创建表 2.查看表 3.删除表 4.修改表结构 5.复制表&#xff08;结构&#xff09; 二.表约束创建 1.约束的作用 2.约束的类型 3.演示 一.表基本操作 1.当前数据库内创建表 CREATE TABLE 表名( 列名 列数据类型&#xff0c; 列名 列…

如何在华为OD机试中获得满分?Java实现【寻找关键钥匙】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

使用compose desktop构建桌面应用

使用compose desktop构建桌面应用时遇到的一些坑 官方指导移步&#xff1a;多平台开发说明&#xff0c;我这里只写一些自己遇到问题 我在mac机器开发&#xff0c;然后使用githubAction构建的win平台的包&#xff0c;现记录一下遇到的问题 构建文件build.gradle编写不同平台的程…

SAM-MM-配额协议字段解析

1、有效起始日&#xff1a;配额协议的生效日期&#xff0c;系统默认为当前创建日期&#xff0c;灰色&#xff0c;不可更改&#xff1b; 2、有效至&#xff1a;配额协议的失效日期&#xff0c;要手动填一个日期&#xff1b; 3、最小数量拆分&#xff1a;如果要按照配额比例&am…

.NET面向AI编程——SK框架(SemanticKernel)的简易入门实践

前言&#xff1a;随着ChatGPT开始在各个领域遍地开花&#xff0c;有关的应用也开始层出不穷。随着微软开源SK框架&#xff0c;无疑是给.NET开发者带来面向AI应用的新机遇。以下内容&#xff0c;通过创建一个简单的prompt开始&#xff0c;开发一个使用SK框架进行开发的入门教程&…

xss跨站之waf绕过及安全修复(28)

手工探针xss绕过waf规则 打开靶场 写入跨站测试语句发现拦截 这里就做一个最经典的方法&#xff0c;做一个关键字拆分来确立拦截的是什么东西。 去掉最后字符串&#xff0c;访问还是拦截&#xff0c;再去掉alert&#xff08;1&#xff09;&#xff0c;访问还是拦截&#xff…

八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(上)

目录 前言 直接插入排序&#xff08;Insertion Sort&#xff09; 一、概念及其介绍 二、过程图示 三、代码 四、复杂度 希尔排序&#xff08;Shell Sort&#xff09; 一、概念 二、实现思路 三、图示过程 四、代码 4.1代码 4.2运行结果 4.3解释 五、复杂度 堆排…

华为诺亚实验室VanillaNet学习笔记

华为诺亚实验室VanillaNet学习笔记 VanillaNet: the Power of Minimalism in Deep Learning Abstract 基础模型的核心理念是“多而不同”&#xff0c;计算机视觉和自然语言处理领域的惊人成功就是例证。然而&#xff0c;优化的挑战和变压器模型固有的复杂性要求范式向简单性…

Linux:finalshell虚拟机与真实机的上传和下载;rz、sz

使用命令rz上传的速度会比拖拽上传的速度慢

Day3:Windows网络编程-UDP

对比TCP与UDP的通信区别 UDP Server没有listen()和accept() TCP Server #include <iostream> #include <WinSock2.h> // 包含网络库 #pragma comment(lib,"ws2_32.lib") using namespace std;int main() {// 1. 初始化套接字 初始化套接字库cout <&l…

Qt编写视频监控系统76-Onvif跨网段组播搜索和单播搜索的实现

一、前言 在视频监控行业一般会用国际onvif工具来测试设备是否支持onvif协议&#xff0c;工具的名字叫ONVIF Device Manager&#xff08;还有个工具叫ONVIF Device Test Tool&#xff0c;专用于程序员测试各种数据交互&#xff09;&#xff0c;可以自行搜索下载&#xff0c;此…

linux网桥简单理解和持久化配置

文章目录 前言一、Linux 网桥是什么&#xff1f;二、网桥主要作用三、网桥配置命令及安装(CentOS系统)1 网桥配置命令2.持久化网桥配置 前言 linux bridge是网络虚拟化中非常重要的一种设备&#xff0c;今天就来学习下linux bridge的相关知识 一、Linux 网桥是什么&#xff1…

Allegro操作规范

光绘输出操作规范 1.1添加钻孔表 添加钻孔表的具体步骤为: 1.通过屏幕右边的Visibility选项的Views列表,将Drill层打开 2.将Visibility选项中的PIN和Via选项都选中,见下图所示: 1.2添加钻孔文件 参数设好之后关闭NC Drill/Parameters窗口,输出数控机床钻孔文件的命…

企业域名与企业邮箱:提升企业形象的必备选择

在商业中&#xff0c;你最不想做的就是把注意力从业务上移开&#xff0c;去担心一些小事——比如电子邮件。大多数免费的企业电子邮件账户偷工减料&#xff0c;因此无法交付货物。在Zoho我们围绕您的需求设计了我们的平台&#xff0c;以创建优于其他工作电子邮件地址的电子邮件…

jQuery-从左到右、从右到左

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>从左到右、从右到左</title> <style type"text/css"> select { …