两个数组的交集

力扣题目链接(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. [官网]Apache Log4j2 最新版安全提示 2.17.0

    https://logging.apache.org/log4j/2.x/ 最近一个周的时间 log4j2 从 2.14 跃升到了2.17 还在不停的升级 安全问题正是焦头烂额 free softwa ...

  2. Linux 界面能够出现ip地址提示的方法

    cat <<EOF >/etc/profile.d/ip.sh if [[ `tty | grep "pts"` ]]; then export PS1='['& ...

  3. 【学到了】golang的[]byte可以append string类型的数据

    上代码: func Test_use_string(t *testing.T){ arr := make([]byte,0, 100) arr = append(arr, "abcd&quo ...

  4. dump分析器winbdg

    工具: winbdg WinDBG不是专门用于调试.Net程序的工具,它更偏向于底层,可用于内核和驱动调试.进行普通的.Net程序调试还是使用微软专为.Net开发的调试工具MDBG更方便一些.但是Wi ...

  5. Vue双向数据绑定原理-下

    Vue双向数据绑定原理-下这一篇文章主要讲解Vue双向数据绑定的原理,主要是通过Object.defineProperty()来实现的,这里我们手写Vue双向数据绑定的原理. 首先我提出一个需求,我的 ...

  6. 【三】强化学习之PaddlePaddlle-Notebook、&pdb、ipdb 调试---及PARL框架

    相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...

  7. hadoop-3.0.0-cdh6.3.2源码编译实践

    1.编译过程 参考:https://blog.mygallop.cn/2020/10/centos/hadoop-cdh6-compile/ 2.问题记录 CDH6.3.2 Hadoop源码位置发生变 ...

  8. 基于SLAM的规划算法仿真复现|SLAM|智能规划

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

  9. Springboot创建项目、docker安装mysql及mybatis-plus调试

    Springboot创建项目及测试 1️⃣ idea构建springboot项目 2️⃣ 测试类 hello 1. 代码 RestController是ResponseBody + controlle ...

  10. docker 安装 jenkins

    最近在做一个智能床垫的项目,为了方便测试上周客户新给了一台华为云服务器.要求在一天内把之前阿里云服务器的环境以及java应用迁到新服务器.所以,我就需要在新服务器安装redis,mysql,jenki ...