【LeetCode哈希表#2】两个数组的交集(Set+数组)
两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。
说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
思路
哈希表最擅长解决的一类问题是:
给一个元素,判断该元素在某个集合中是否出现过
本题也是非常符合哈希表的使用场景
选择合适的哈希表也是使用哈希方法时的关键
之前有提到,哈希表的实现大致有三类:数组、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+数组)的更多相关文章
- Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)
Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...
- leetcode.哈希表.594最长和谐子序列-Java
1. 具体题目: 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1.现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5 ...
- LeetCode 哈希表 380. 常数时间插入、删除和获取随机元素(设计数据结构 List HashMap底层 时间复杂度)
比起之前那些问计数哈希表的题目,这道题好像更接近哈希表的底层机制. java中hashmap的实现是通过List<Node>,即链表的list,如果链表过长则换为红黑树,如果容量不足(装填 ...
- LeetCode哈希表
1. Two Sum https://leetcode.com/problems/two-sum/description/ 不使用额外空间需要n*n的复杂度 class Solution { publ ...
- leetcode.哈希表.128最长连续序列-Java
1. 具体题目 给定一个未排序的整数数组,找出最长连续序列的长度.要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 ...
- Map - leetcode [哈希表]
149. Max Points on a Line unordered_map<float, int> hash 记录的是斜率对应的点数 unordered_map<float, i ...
- [PHP内核探索]PHP中的哈希表
在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...
- 从HashMap透析哈希表
##扯数据结构 先看一下哈希表的概念: 哈希表是一种数据结构,它可以提供快速的插入操作和查找操作.第一次接触哈希表,他会让人难以置信,因为它的插入和删除.查找都接近O(1)的时间级别.用哈希表,很多操 ...
- 哈希表工作原理 (并不特指Java中的HashTable)
1. 引言 哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用. 哈希表最大的优点,就是把数据的存储和查找消耗的时 ...
- Java数据结构和算法(十三)——哈希表
Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构.它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组.链表 ...
随机推荐
- [官网]Apache Log4j2 最新版安全提示 2.17.0
https://logging.apache.org/log4j/2.x/ 最近一个周的时间 log4j2 从 2.14 跃升到了2.17 还在不停的升级 安全问题正是焦头烂额 free softwa ...
- Linux 界面能够出现ip地址提示的方法
cat <<EOF >/etc/profile.d/ip.sh if [[ `tty | grep "pts"` ]]; then export PS1='['& ...
- 【学到了】golang的[]byte可以append string类型的数据
上代码: func Test_use_string(t *testing.T){ arr := make([]byte,0, 100) arr = append(arr, "abcd&quo ...
- dump分析器winbdg
工具: winbdg WinDBG不是专门用于调试.Net程序的工具,它更偏向于底层,可用于内核和驱动调试.进行普通的.Net程序调试还是使用微软专为.Net开发的调试工具MDBG更方便一些.但是Wi ...
- Vue双向数据绑定原理-下
Vue双向数据绑定原理-下这一篇文章主要讲解Vue双向数据绑定的原理,主要是通过Object.defineProperty()来实现的,这里我们手写Vue双向数据绑定的原理. 首先我提出一个需求,我的 ...
- 【三】强化学习之PaddlePaddlle-Notebook、&pdb、ipdb 调试---及PARL框架
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- hadoop-3.0.0-cdh6.3.2源码编译实践
1.编译过程 参考:https://blog.mygallop.cn/2020/10/centos/hadoop-cdh6-compile/ 2.问题记录 CDH6.3.2 Hadoop源码位置发生变 ...
- 基于SLAM的规划算法仿真复现|SLAM|智能规划
图片来自百度百科 前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https: ...
- Springboot创建项目、docker安装mysql及mybatis-plus调试
Springboot创建项目及测试 1️⃣ idea构建springboot项目 2️⃣ 测试类 hello 1. 代码 RestController是ResponseBody + controlle ...
- docker 安装 jenkins
最近在做一个智能床垫的项目,为了方便测试上周客户新给了一台华为云服务器.要求在一天内把之前阿里云服务器的环境以及java应用迁到新服务器.所以,我就需要在新服务器安装redis,mysql,jenki ...