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

16-算法打卡-哈希表-两个数组的交集-leetcode(349)-第十六天

1 题目地址

349. 两个数组的交集 - 力扣(LeetCode)349. 两个数组的交集 - 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]解释:[4,9] 也是可通过的 提示: * 1 <= nums1.length, nums2.length <= 1000 * 0 <= nums1[i], nums2[i] <= 1000 https://leetcode.cn/problems/intersection-of-two-arrays/description/


2 题目说明

给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

 

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

 

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000


3 解题思路

方式一:使用HashSet
1、将数组nums1的数据放入到HashSet中
2、遍历nums2中的数据是否存在HashSet中,存在在放入到另外一个HashSet中

方式二:使用哈希表(数组) 【题干中限制了nums1 nums2的长度、数值都小于等于1000】
如果题干没有限制,其实是不太适合用哈希表实现的,而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
1、创建两个数组nums1Array、nums2Array长度都为1001
                (nums[i]=1000需要往nums1Array[1000]=1;数组长度设置成1000会报数组下标越界)
2、分别遍历nums1,nums2,将数据分别放入到nums1Array、nums2Array; nums1[i]的值映射成数组的index,出现的次数映射成value
3、判断两个数组nums1Array、nums2Array中的索引下标对应的value都大于0表示存在相同的数字。


4 代码编写


4.1 HashSet方式

class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> nums1Set = new HashSet<>();Set<Integer> resultSet = new HashSet<>();for (int i=0; i<nums1.length; i++) {nums1Set.add(nums1[i]);}for (int i=0; i<nums2.length; i++) {if (nums1Set.contains(nums2[i])) {resultSet.add(nums2[i]);}}return resultSet.stream().mapToInt(x->x).toArray();}
}


4.2 使用hash数组

 int[] nums1Array = new int[1001];
 int[] nums2Array = new int[1001]; 
注意这块长度如果设置成1000,会报数组下标越界,当数组中存在1000的时候,就需要往nums1Array[1000]=1

class Solution {public int[] intersection(int[] nums1, int[] nums2) {int[] nums1Array = new int[1001];int[] nums2Array = new int[1001];for (int i=0; i<nums1.length; i++) {nums1Array[nums1[i]]++; // 关键码(索引)表示数据,关键值(数据)表示数量}for (int i=0; i<nums2.length; i++) {nums2Array[nums2[i]]++; // 关键码(索引)表示数据,关键值(数据)表示数量}List<Integer> resultList = new ArrayList<>();for (int i=0; i<1001; i++) {if (nums1Array[i]>0 && nums2Array[i]>0) {resultList.add(i);}}return resultList.stream().mapToInt(Integer::intValue).toArray();}
}

 

相关文章:

  • 使用 PM2 启动node服务,并添加监控接口
  • Linux系统之restore命令的基本使用
  • d3.js绘制组合PCA边缘分布图
  • 数据结构(6)
  • MYOJ_11700(UVA10591)Happy Number(快乐数)(超快解法:图论思想解题)
  • 阿尔特拉 EP1C12F324I7N AlteraFPGA Cyclone
  • Redis——数据结构
  • 【ELF2学习板】OpenCL程序测试
  • 逻辑删除表结构如何加唯一索引?
  • Obsidian的简单使用
  • 【Semantic Kernel核心组件】Kernel:掌控AI编排的“中央处理器“
  • Java基础知识面试题(已整理Java面试宝典pdf版)
  • AbMole—如何高效诱导巨噬细胞的极化?
  • 04-libVLC的视频播放器:获取媒体信息
  • 《手环表带保养全攻略:材质、清洁与化学品避坑指南》
  • 力扣349 == 两个数组交集的两种解法
  • 第十五届蓝桥杯青少Python省赛中级组真题 ——浇花系统
  • Java命名规则
  • 01、单片机简介
  • photo-sphere-viewer 4.8.1在vue中使用
  • 法治日报整版聚焦:儿童能否成为短视频主角?该如何监管?
  • 外交部:中方愿根据当事方意愿,为化解乌克兰危机发挥建设性作用
  • 母亲节书单|关于生育自由的未来
  • “拼好假”的年轻人,今年有哪些旅游新玩法?
  • 三星“七天机”质保期内屏幕漏液被要求自费维修,商家:系人为损坏
  • 47本笔记、2341场讲座,一位普通上海老人的阅读史