两个数组的交集

力扣题目链接(opens new window)

题意:给定两个数组,编写一个函数来计算它们的交集。

说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。

思路

哈希表最擅长解决的一类问题是:

给一个元素,判断该元素在某个集合中是否出现过

本题也是非常符合哈希表的使用场景

选择合适的哈希表也是使用哈希方法时的关键

之前有提到,哈希表的实现大致有三类:数组、set、map

数组使用于长度有限的数据(最好是1000个以下),如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

而set则可用于大规模的数据(例如上亿级别)

本题在LeetCode更新后加了限制,因此可以用数组来做也可以用set来做

set

set这种数据结构在C++(std::set【红黑树】、std::multiset【红黑树】、std::unordered_set【哈希表】)和Java(主要是HashSet【数组+链表+红黑树】,当然还有别的实现类)中的特性是类似的

即:

  • set是无序的(添加和取出的顺序不一致),且没有索引

  • set中不允许有重复元素(会自动去重),因此最多包含一个null

  • set不能使用普通for循环遍历,要用迭代器增强for循环

那么实际这题就变成了如何使用set接口的一个演示例题了

首先,新建一个set1,这里选用HashSet(cpp版本用unordered_set),遍历输入的nums1并存入set1

此时,set1中存放的数据就是去重后nums1中的元素

然后,再创建一个set2用于存放比较后的交集元素

遍历nums2,使用每个元素去set1中查询是否有相同的,有就保存到set2

数组

使用数组作为哈希表

遍历nums1,按当前元素在数组中对应下标处标记

如:

nums1 = {1,3,5,9}
↑ 数组 = {0,1,0,...,0}
======================
nums1 = {1,3,5,9}
↑ 数组 = {0,1,0,1,..,0}
======================

把nums1中所有元素在数组中标记后,当前数组就变成了一个哈希表。

输入为:"0~数组长度" 范围内的整数

输出为:一个布尔值,表示输入是否存在

之后,再用同样的方法遍历nums2,用遍历的元素作为下标到数组中查询,如果返回1,则将当前元素添加到一个set中(这样可以去除重复出现的元素)

代码

只使用set

Java版

import java.util.HashSet;
import java.util.Set; class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
//遍历nums1,将元素添加到set1
// //增强for
// for(int i : nums1){
// set1.add(i);
// }
for(int i = 0; i < nums1.length; i++){
set1.add(nums1[i]);
}
//遍历nums2,将所得元素与set1中的对比,相同则存入set2
////增强for
// for(int i : nums2){
// if(set1.contains(i)){
// set2.add(i);
// }
// }
for(int i = 0; i < nums2.length; i++){
if(set1.contains(nums2[i])){
set2.add(nums2[i]);
}
}
//将set转换为数组对象返回
return set2.stream().mapToInt(x -> x).toArray(); }
}

注意点:

1、使用set需要自行导入包

import java.util.HashSet;
import java.util.Set;

2、JavaAPI中Set接口常用方法

  • .add,用于添加数据
  • .contains,查询数据是否存在于set中
  • .stream(),将源数据----包括集合、数组等转换成流
  • .mapToInt(x -> x),将一个流中的元素转换为 int 类型
  • .toArray(), 转换类型为一个数组(Object)

CPP版

待更新
数组

Java版

import java.util.HashSet;
import java.util.Set; class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set4save = new HashSet<>();
int[] hash = new int[1002];//题目限制了nums的大小在1000以下,因此数组可以设置1000左右
//遍历nums1,使用数组hash构建哈希表
for(int num : nums1){
hash[num] = 1;
}
//遍历nums2,用元素值作为下标查询哈希表
for(int num : nums2){
if(hash[num] == 1){
set4save.add(num);
}
}
//将set转换为数组对象返回
return set4save.stream().mapToInt(x -> x).toArray();
}
}

CPP版

使用数组

class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int hash[1001] = {0};
vector<int> res; for(int num1 : nums1) hash[num1] = 1; for(int num2 : nums2){
if(hash[num2] == 1){
hash[num2] = 0;
res.push_back(num2);
}
}
return res;
}
};

【LeetCode哈希表#2】两个数组的交集(Set+数组)的更多相关文章

  1. Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...

  2. leetcode.哈希表.594最长和谐子序列-Java

    1. 具体题目: 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1.现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5 ...

  3. LeetCode 哈希表 380. 常数时间插入、删除和获取随机元素(设计数据结构 List HashMap底层 时间复杂度)

    比起之前那些问计数哈希表的题目,这道题好像更接近哈希表的底层机制. java中hashmap的实现是通过List<Node>,即链表的list,如果链表过长则换为红黑树,如果容量不足(装填 ...

  4. LeetCode哈希表

    1. Two Sum https://leetcode.com/problems/two-sum/description/ 不使用额外空间需要n*n的复杂度 class Solution { publ ...

  5. leetcode.哈希表.128最长连续序列-Java

    1. 具体题目 给定一个未排序的整数数组,找出最长连续序列的长度.要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 ...

  6. Map - leetcode [哈希表]

    149. Max Points on a Line unordered_map<float, int> hash 记录的是斜率对应的点数 unordered_map<float, i ...

  7. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  8. 从HashMap透析哈希表

    ##扯数据结构 先看一下哈希表的概念: 哈希表是一种数据结构,它可以提供快速的插入操作和查找操作.第一次接触哈希表,他会让人难以置信,因为它的插入和删除.查找都接近O(1)的时间级别.用哈希表,很多操 ...

  9. 哈希表工作原理 (并不特指Java中的HashTable)

    1. 引言         哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用.  哈希表最大的优点,就是把数据的存储和查找消耗的时 ...

  10. Java数据结构和算法(十三)——哈希表

    Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构.它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组.链表 ...

随机推荐

  1. [转帖]APIServer dry-run and kubectl diff

    https://kubernetes.io/blog/2019/01/14/apiserver-dry-run-and-kubectl-diff/ Monday, January 14, 2019 A ...

  2. 感性理解 int 与 long long 的速度差距 & 感性理解不同取模方法的差距

    long long 题该怎么做?#define int long long 会多慢? 有时候,当我们被卡常的时候,不妨想一想,自己在开头定义的 #define int long long 有多大影响? ...

  3. Typescript中存取器getters和setters的使用

    1.存取器 存取器可以让我们可以有效的控制对,对象中的中的成员的访问. 可以通过getters和setters来进行操作 在typescript中分别对应 get 和 set 2.如何解决报错 typ ...

  4. elementui表格内容超出显示省略号

    有些时候表格的内容太长了: 但是elementui中的表格,会进行换行处理: 此时表格的高度就会发生变化 这样就不好看,此时就要进行省略号来出来这个问题: el-table是有这个控制属性的::sho ...

  5. Pytorch分布式训练,其他GPU进程占用GPU0的原因

    问题 最近跑师兄21年的论文代码,代码里使用了Pytorch分布式训练,在单机8卡的情况下,运行代码,出现如下问题. 也就是说GPU(1..7)上的进程占用了GPU0,这导致GPU0占的显存太多,以至 ...

  6. 中文多模态医学大模型智能分析X光片,实现影像诊断,完成医生问诊多轮对话

    中文多模态医学大模型智能分析X光片,实现影像诊断,完成医生问诊多轮对话 1.背景介绍介绍 最近,通用领域的大语言模型 (LLM),例如 ChatGPT,在遵循指令和产生类似人类响应方面取得了显著的成功 ...

  7. 从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建、医药知识图谱的自动问答等

    从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建.医药知识图谱的自动问答等 项目介绍 关于知识图谱概念性的介绍就不在此赘述.目前知识图谱在各 ...

  8. python编程中,各种随机种子seed设置总结

    python随机种子seed的作用(强化学习常用到)_汀.的博客-CSDN博客先上代码import mathimport gymfrom gym import spaces, loggerfrom g ...

  9. 深空物联网通信中视频流的智能多路TCP拥塞控制|文献阅读|文献分析和学习|拥塞控制|MPTCP|SVC

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https://blog.cs ...

  10. java将集合里面的元素拼接为一条String字符串

    java将集合里面的元素拼接为一条String字符串 1️⃣ 随便创建一个list集合,往里面塞入元素 2️⃣ 第一种方式:通过foreach循环实现 但是通过这种方式只能将list集合里面的元素取出 ...