两个数组的交集

力扣题目链接(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. reposync与createrepo创建离线yum源的方法

    背景 昨天晚上进行了在线升级银河麒麟V10SP2的audit和mate-indicator的rpm包 今天想了下,如果机器无法上网. 必须得在公司内部搭建一套离线的rpm源进行处理 想了下还是使用re ...

  2. [转贴]30 分钟学会 AWK

    30 分钟学会 AWK https://mp.weixin.qq.com/s/X0ire4dYiceC2CzPU6JsSw? Linux爱好者 2017-01-08   (点击上方公众号,可快速关注) ...

  3. 分布式日志追踪ID实战 | 京东物流技术团队

    本文通过介绍分布式应用下各个场景的全局日志ID透传思路,以及介绍分布式日志追踪ID简单实现原理和实战效果,从而达到通过提高日志查询排查问题的效率. 背景 开发排查系统问题用得最多的手段就是查看系统日志 ...

  4. 一台不容错过的Java单元测试代码“永动机”

    作者:京东零售 陈志良 作为一名京东的软件匠人,我们开发的软件支撑着数亿的用户,责任是重大的,因此我们深深地敬畏每一行代码,那如何将我们的失误降到最低呢?那就是单元测试,它会让我们树立对代码的自信心. ...

  5. 浅析大促备战过程中出现的fullGc,我们能做什么?

    作者:京东科技 白洋 前言: 背景: 为应对618.双11大促,消费金融侧会根据零售侧大促节奏进行整体系统备战.对核心流量入口承载的系统进行加固优化,排除系统风险,保证大促期间系统稳定. 由于大促期间 ...

  6. React数据通信父传子和子传父的使用

    组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...

  7. echarts轮训展示某个

    //学校资产占比的配置 function schollAssets() { var myChart = window.$echarts.init( document.getElementById('s ...

  8. [置顶] python常用web开发框架

    Flask篇 第一篇:初识Flask.快速启动 第二篇:Flask四剑客 第三篇:Flask的配置文件 第四篇:Flask路由 第五篇:Flask模板渲染 第六篇:Flask的请求与响应 第七篇:Fl ...

  9. 《IDEA Plugin 开发手册》• 小傅哥.pdf | 年前整理的最后一本PDF资料

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么?写写快乐的热门文章不好吗! 从开始准备成体系的编写 IDEA Plugin ...

  10. Intel(R) Ethernet Controller X710驱动升级

    环境 CentOS Linux release 7.9.2009 (Core) 升级 先查看原驱动版本 [root@xcdcs ~]# lspci |grep net 01:00.0 Ethernet ...