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

代码随想录刷题day16|(哈希表篇)349.两个数组的交集

目录

一、哈希表理论基础

二、集合set在哈希法中的应用

三、相关算法题目

四、相关知识点

1.set集合特点和常用方法

1.1 set集合概述

1.2 set集合特点

1.3 常用方法

2.set集合转换成数组

法1:另新建一个数组

 法2:将结果集合转为数组 ▲

3.数组中元素放进set集合中


一、哈希表理论基础

详见 代码随想录刷题day15|(哈希表篇)242.有效的字母异位词、383.赎金信-CSDN博客

二、集合set在哈希法中的应用

一般来说,给定一个元素,判断是否在集合中出现过,这种情况下考虑使用哈希表来解决问题;

本题力扣中限制了数据范围,所以也可以用数组来做,如果没有限制数据范围,那么不可以使用数组来做(数组的长度不可变),同时,如果数值很大、或者数值不太大,但很分散,比如0、5、100万,那么也不适合用数组来做;

本题需要注意的一点是:最终返回的数组中,每个元素都是唯一的,即去重的,因此可以使用set集合,利用set集合中数据元素不重复的特性;

思路:将数组nums1的元素放到一个哈希表中,java中可以采用HashSet集合:set,这样set集合中没有重复元素;遍历nums2数组,并在set集合中查找nums2中每一个元素是否出现过,如果出现过,则为相交部分元素,放在另一HashSet集合:result中,最终将result集合转成数组 并返回;

为什么最终结果要放在集合result中?set保证了nums1中的元素不重复,但是nums2数组中元素也可能会重复,所以最终结果也可能会重复,所以需要放在result集合中;

补充:本题使用数组的思路

整体思路同使用set集合,具体实现上,将nums1数组中元素存储到哈希表中,此时哈希表使用数组array,用数组下标直接做哈希映射,将nums1中的每一个元素作为 数组的索引值,即 array [ nums1[i] ],并对该索引处的元素全部赋值为1,同时也能够达到去除重复数据的目的(如果有相同元素,在array中 表现为 对同一索引处的元素多次赋值为1);

接着,遍历nums2,并在哈希数组中查找每一个元素:将nums2数组中的每一个元素作为array数组的索引值,查看对应索引值是否为1,如果为1,则说明是相交元素,否则,不是相交元素;

最后,将相交元素存入新建集合result中⚠️,这里使用集合是为了去除重复元素,最后再将集合转成数组,然后返回;

与set集合的区别:

使用set集合时,每add一个值,就要进行一次哈希运算,将该值转换成内部存储的一个值,同时需要开辟一个新的空间,相对数组来说,需要更多的时间,花费更高;

三、相关算法题目

349.两个数组的交集

349. 两个数组的交集 - 力扣(LeetCode)

使用set集合: 

class Solution {public int[] intersection(int[] nums1, int[] nums2) {//定义HashSet集合 HashSet<Integer> set =new HashSet<Integer>();HashSet<Integer> result =new HashSet<Integer>();//将nums1放到哈希表结构中 增强for循环▲ set无法使用普通for循环for(int c : nums1){set.add(c);}//遍历数组2的过程中判断哈希表中是否存在该元素for(int c : nums2){if(set.contains(c)){result.add(c);}}//把set 转化成 数组//另外申请一个数组存放setRes中的元素,最后返回数组int[] arr = new int[result.size()];int j = 0;for(int c : result){arr[j++] = c;}return arr;}
}

 使用数组:

class Solution {public int[] intersection(int[] nums1, int[] nums2) {//使用数组int[] array = new int[1002];//定义哈希数组HashSet<Integer> result = new HashSet<Integer>();//存放结果的集合 去除重复元素//将nums1中的元素 添加到哈希数组中for(int i = 0;i < nums1.length;i++){array[nums1[i]] = 1;}//遍历nums2数组 在哈希数组中查找对应元素for(int c : nums2){if(array[c] == 1){result.add(c);}}//新建数组 存储集合result中的结果int[] array2 = new int[result.size()];int i = 0;for(int c : result){array2[i] = c;i++;}return array2;}
}

四、相关知识点

1.set集合特点和常用方法

1.1 set集合概述

set集合的父类是collection(单列集合),set集合中常用的两个实现类为:HashSet 和 TreeSet,前者底层数据结构是哈希表,后者是红黑树;

定义set集合,set是接口,不可直接创建对象,只能通过实现类创建具体的对象;

Set<Integer> set = new HashSet<Integer>();

1.2 set集合特点

  • set集合:不可存储重复元素、没有索引,不能使用普通for循环遍历;
  • HashSet集合:set集合特点➕可以将元素按照规则进行排序;
  • TreeSet集合:set集合特点➕存取无序;

1.3 常用方法

几个常用方法: 

boolean add(E e) :向集合中添加元素;

boolean contains(Object o):查找集合中是否存在元素o;

int size():返回集合中元素个数;

Object[] toArray():返回一个包含set集合中的所有元素的数组;

2.set集合转换成数组

法1:另新建一个数组

另外申请一个数组存放HashSet中的元素,最后返回数组;

int[] arr = new int[result.size()];
int j = 0;
for(int c : result){arr[j++] = c;
}

 法2:将结果集合转为数组 ▲

result.stream().mapToInt(x -> x).toArray();
  • resSet.stream()

    • HashSet<Integer> 转换为一个流(Stream)。流是一种高级迭代器,可以对集合中的元素进行操作。

  • .mapToInt(x -> x)

    • 将流中的每个元素(Integer 类型)映射为 int 类型。x -> x 是一个Lambda表达式,表示将输入的 Integer 对象直接转换为其基本类型 int

  • .toArray()

    • 将流中的 int 类型元素收集到一个数组中,返回一个 int[]

最终,这行代码返回一个 int[] 类型的数组,其中包含集合 result中的所有元素。

 PS:为什么 return result.toArray() 报错?▲

incompatible types: Object[] cannot be converted to int[]

这行代码尝试将一个集合(如 HashSet<Integer>)直接转换为数组。然而,toArray() 方法返回的是一个 Object[] 类型的数组,而不是 int[]。在Java中,Object[]int[] 是不兼容的类型,因此不能直接将 Object[] 赋值给 int[]

3.数组中元素放进set集合中

使用增强for循环;

for(int c : nums1){set.add(c);
}

相关文章:

代码随想录刷题day16|(哈希表篇)349.两个数组的交集

目录 一、哈希表理论基础 二、集合set在哈希法中的应用 三、相关算法题目 四、相关知识点 1.set集合特点和常用方法 1.1 set集合概述 1.2 set集合特点 1.3 常用方法 2.set集合转换成数组 法1&#xff1a;另新建一个数组 法2&#xff1a;将结果集合转为数组 ▲ 3.数组…...

Synology 群辉NAS安装(6)安装mssql

Synology 群辉NAS安装&#xff08;6&#xff09;安装mssql 写在前面mssql 2019:成功安装说明&#xff0c;这个最终成功了 mssql 2022没有成功1. pull image2.启动mssql docker container 远程连接 写在前面 mssq是一个重要节点。 这是因为我对mysql没有一丝好感。虽然接触了许…...

2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文

模型设计思路与创新点&#xff1a; 建模的时候应该先确定我们需要建立什么类的模型&#xff1f;优化类还是统计类&#xff1f;这个题需要大量的数据分析&#xff0c;因此我们可以建立一个统计学模型。 统计学建模思路&#xff1a;观察规律&#xff0c;建立模型&#xff0c;参…...

Hook 函数

什么是hook函数&#xff1f; 在计算机编程中&#xff0c;hook函数是指在特定的事件发生时被调用的函数&#xff0c;用于在事件发生前或后进行一些特定的操作。通常&#xff0c;hook函数作为回调函数被注册到事件处理器中&#xff0c;当事件发生时&#xff0c;事件处理器会自动…...

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组&#xff0c;这种问题就可以迎刃而解了 比如我们是4的话&#xff0c;我们从左向右开始存&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 到5的时候y就大于4了就是越界了&…...

DeepSeek-R1解读:纯强化学习,模型推理能力提升的新范式?

DeepSeek-R1解读&#xff1a;纯强化学习&#xff0c;模型推理能力提升的新范式&#xff1f; 1. Impressive Points2. 纯强化学习&#xff0c;LLM推理能力提升新范式&#xff1f;2.1 DeepSeek-R1-Zero2.2 DeepSeek-R1 3. 端侧模型能力提升&#xff1a;蒸馏>强化学习 1. Impre…...

深度解析:基于Vue 3的教育管理系统架构设计与优化实践

一、项目架构分析 1. 技术栈全景 项目采用 Vue 3 TypeScript Tailwind CSS 技术组合&#xff0c;体现了现代前端开发的三大趋势&#xff1a; 响应式编程&#xff1a;通过Vue 3的Composition API实现细粒度响应 类型安全&#xff1a;约60%的组件采用TypeScript编写 原子化…...

【PyTorch】3.张量类型转换

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…...

Spring Boot整合JavaMail实现邮件发送

一. 发送邮件原理 发件人【设置授权码】 - SMTP协议【Simple Mail TransferProtocol - 是一种提供可靠且有效的电子邮件传输的协议】 - 收件人 二. 获取授权码 开通POP3/SMTP&#xff0c;获取授权码 授权码是QQ邮箱推出的&#xff0c;用于登录第三方客户端的专用密码。适用…...

字节跳动发布UI-TARS,超越GPT-4o和Claude,能接管电脑完成复杂任务

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

数据的秘密:如何用大数据分析挖掘商业价值

数据的秘密&#xff1a;如何用大数据分析挖掘商业价值 在这个数据爆炸的时代&#xff0c;我们每天都在产生、存储和处理着海量的数据。然而&#xff0c;仅仅拥有数据并不等于拥有价值。就像拥有一座金矿&#xff0c;不开采和提炼&#xff0c;最终只是一堆毫无用处的石头。如何…...

OAuth1和OAuth2授权协议

OAuth 1 授权协议 1. 概述 OAuth1 是 OAuth 标准的第一个正式版本&#xff0c;它通过 签名和令牌 的方式&#xff0c;实现用户授权第三方访问其资源的功能。在 OAuth1 中&#xff0c;安全性依赖于签名机制&#xff0c;无需传递用户密码。 2. 核心特性 使用 签名&#xff08…...

AI学习(vscode+deepseek+cline)

1、网页生成不成功时&#xff0c;直接根据提示让模型替你解决问题 2、http://localhost:3000 拒绝链接时&#xff0c;cmd输入命令InetMgr&#xff0c;网站右键新建-配置你的网页代码物理地址&#xff0c;这里我还输入本机登录名及密码了&#xff0c;并把端口地址由默认80修改为…...

04-机器学习-网页数据抓取

网络爬取&#xff08;Web Scraping&#xff09;深度指南 1. 网络爬取全流程设计 一个完整的网络爬取项目通常包含以下步骤&#xff1a; 目标分析&#xff1a; 明确需求&#xff1a;需要哪些数据&#xff08;如商品价格、评论、图片&#xff09;&#xff1f;网站结构分析&…...

计网week1+2

计网 一.概念 1.什么是Internet 节点&#xff1a;主机及其运行的应用程序、路由器、交换机 边&#xff1a;通信链路&#xff0c;接入网链路主机连接到互联网的链路&#xff0c;光纤、网输电缆 协议&#xff1a;对等层的实体之间通信要遵守的标准&#xff0c;规定了语法、语义…...

重定向与缓冲区

4种重定向 我们有如下的代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h>#define FILE_NAME "log.txt"int main() {close(1)…...

练习题 - Django 4.x File 文件上传使用示例和配置方法

在现代的 web 应用开发中,文件上传是一个常见的功能,无论是用户上传头像、上传文档,还是其他类型的文件,处理文件上传都是开发者必须掌握的技能之一。Django 作为一个流行的 Python web 框架,提供了便捷的文件上传功能和配置方法。学习如何在 Django 中实现文件上传,不仅…...

[VSCode] vscode下载安装及安装中文插件详解(附下载链接)

VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和Git版本控制系统。 下载链接&#xff1a;https://pan.quark.cn/s/3a90aef4b645 提取码&#xff1a;NFy5 通过上面…...

JVM常见知识点

在《深入理解Java虚拟机》一书中&#xff0c;介绍了JVM的相关特性。 1、JVM的内存区域划分 在真实的操作系统中&#xff0c;对于地址空间进行了分区域的设计&#xff0c;由于JVM是仿照真实的机器进行设计的&#xff0c;那么也进行了分区域的设计。核心区域有四个&#xff0c;…...

深入探索 Vue 3 Markdown 编辑器:高级功能与实现

目录 1. 为什么选择 Markdown 编辑器&#xff1f;2. 选择合适的 Markdown 编辑器3. 安装与基本配置安装 配置 Markdown 编辑器代码说明 4. 高级功能实现4.1 实时预览与双向绑定4.2 插入图片和图像上传安装图像上传插件配置图像上传插件 4.3 数学公式支持安装 KaTeX配置 KaTeX 插…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...