Leetcode 349 两个数组的交集 (*哈希数组,*HashSet,*HashMap)

news2024/9/24 17:12:33

Leetcode 349 两个数组的交集 (*哈希数组,*HashSet,*HashMap)

    • 解法1 [用数组构建hashmap] 😋
    • HashSet and .HashMap
      • 1.HashSet
      • 2.HashMap
    • 解法2 [使用HashSet]⭐️

在这里插入图片描述

解法1 [用数组构建hashmap] 😋

自己的笨比方法:【哇这居然是标准解法之一,我不是笨比😋😋😋】
创建了两个hash数组,nums1出现一个就对应位置变为-1,nums2出现一个对应位置就为-1,之后如果nums1[m]+nums2[m]
== -2,则说明是交集,使用arr.add()加到末尾,最后再将ArrayList 转化为int[ ] 数组

// ArrayList<Integer> 转化为int[ ] 数组
int[] array = new int[arr.size()];
for(int i = 0; i < arr.size(); i++){
    array[i] = arr.get(i);
}

时间复杂度O(N)
空间复杂度O(N)

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 数组作为hash表
        ArrayList<Integer> arr = new ArrayList<>();
        int[] hash1 = new int[1001];
        int[] hash2 = new int[1001];
        
 
        for(int i = 0; i < nums1.length; i++){
            hash1[nums1[i]] = -1;
        }
        for(int j = 0; j < nums2.length; j++){
            hash2[nums2[j]] = -1;
        }
         for(int m = 0; m <= 1000; m++){
            if(hash1[m]+hash2[m] == -2){
                arr.add(m);
            }
        }

        int[] array = new int[arr.size()];
        for (int i = 0; i < arr.size(); i++) {
            array[i] = arr.get(i);
        }
        return array;
    }
}  

HashSet and .HashMap

1.HashSet

import java.util.HashSet

HashSet和HashMap是Java集合框架中的两个不同的类,用于存储和操作数据。

HashSet是一个基于哈希表的集合实现,它实现了Set接口。它使用哈希表来存储元素,不允许重复元素,并且不保证元素的顺序。HashSet提供了高效的插入、删除和查找操作,时间复杂度为O(1)。它适用于需要快速查找和去重的场景。

以下是HashSet的一些常用操作方法:
- add(element):向集合中添加元素。
- remove(element):从集合中移除指定元素。
- contains(element):判断集合中是否包含指定元素。
- size():返回集合中元素的数量。

2.HashMap

HashMap是一个基于哈希表的键值对存储实现,它实现了Map接口。它使用哈希表来存储键值对,其中每个键都是唯一的。HashMap提供了高效的插入、删除和查找操作,时间复杂度为O(1)。它适用于需要根据键快速查找和操作值的场景。

以下是HashMap的一些常用操作方法:
- put(key, value):将键值对添加到映射中。
- get(key):根据键获取对应的值。
- remove(key):根据键移除对应的键值对。
- containsKey(key):判断映射中是否包含指定的键。
- containsValue(value):判断映射中是否包含指定的值。
- size():返回映射中键值对的数量。

总结来说,HashSet用于存储唯一的元素集合,而HashMap用于存储键值对映射。它们都提供了高效的操作方法,但在使用时需要根据具体的需求选择合适的集合类型。


解法2 [使用HashSet]⭐️

时间复杂度O(N)
空间复杂度O(N)

⭐️【HashSet】无序不重复
import java.util.HashSet;
新建Hashset:Hashset<Integer> hashset = new HashSet<>();
Hashset存在元素:hash.contains();
Hashset添加元素:hash.add();
取Hashset中的元素:增强型for循环 for(int index num : hashset){ }
Hashset的大小:hashset.size()

将HashSet转化为int[ ]:
方法1:return resSet.stream().mapToInt(x -> x).toArray(); 这行代码使用了 Java 8 中的流式操作来将 HashSet 转换为 int[] 数组。
方法2:增强型for循环遍历hashset中元素,弄到数组中,原因是hashset无序

int index = 0;
for(int num : hashset2){ // 使用【增强型for循环遍历hashset中元素,弄到数组中,原因是hashset无序】
     res[index++] = num;
}

解释这行代码的步骤如下:

  1. resSet.stream() 将 HashSet 转换为一个流(Stream)对象。
  2. mapToInt(x -> x) 将流中的每个元素映射为 int 类型。这里的 x -> x 是一个 lambda 表达式,表示对每个元素不进行任何操作,直接返回原值。
  3. toArray() 将流中的元素收集到一个数组中。

最终,这行代码返回的是一个 int[] 数组,其中包含了 HashSet 中的元素。

请注意,使用流式操作可以简化代码,并且在一行中完成转换操作。但是,这种方式可能会对性能产生一定的影响,因为涉及到了流的创建和操作。在处理大量数据时,可能需要考虑性能方面的问题。

import java.util.HashSet;
import java.util.Arrays;


class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 新建2个hashset 内不含重复元素,但不保证顺序
        HashSet<Integer> hashset1 = new HashSet<>();
        HashSet<Integer> hashset2 = new HashSet<>();

        // 将nums1数组中的元素添加到hashset1中
        for(int i = 0; i < nums1.length; i++){
            hashset1.add(nums1[i]);
        }

        // 遍历nums2数组,如果元素在set1中存在,则将元素添加到hashset2中
        for(int i = 0; i < nums2.length; i++){
            if(hashset1.contains(nums2[i])){
                hashset2.add(nums2[i]);
            }  
        }

        // 将set转化为int[]数组输出
        int[] res = new int[hashset2.size()];
        int index = 0;
        for(int num : hashset2){ // 使用【增强型for循环遍历hashset中元素,弄到数组中,原因是hashset无序】
            res[index++] = num;
        }
        return res;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1111041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ES实战】ES主副分片数据不一致分析

ES主副分片数据不一致分析 文章目录 ES主副分片数据不一致分析问题描述问题重现问题分析修复方案 问题描述 在请求索引中的某一条数据时&#xff0c;时而查询有结果&#xff0c;时而无结果。两种情况交替出现。 问题重现 通过对问题数据的点查&#xff0c;确实重现了该现象 …

CSDN 操作

CSDN的目录界面&#xff0c;会随着浏览器界面的大小而变化&#xff0c;分布在左边位置或者右边位置。 目录界面在右&#xff1a; 目录界面在左&#xff1a; 按键Ctrl&#xff0c; 滑动鼠标滚轮&#xff0c;就可以放大或者缩小界面。

Intelijj使用Gitee团队开发

初始化项目到Gitee服务器 成功标识&#xff1a; 添加团队成员 点击管理——仓库成员设置——开发者 2.添加仓库成员 &#xff08;最多不超过5人&#xff09; 3.通过链接或者二维码邀请新成员&#xff0c;或者可以自己手动添加新成员并提交 多人项目仓库创建完成 通…

有什么小程序可以下载视频号的视频?

​最近有一些朋友问我&#xff0c;【视频号下载助手】和【视频下载bot】小程序&#xff0c;有什么作用&#xff1f; 首先视频号下载助手是协助用户进行下载的&#xff0c;但由于下载要符合平台规定&#xff0c;我们就将视频下载助手与视频下载bot小程序想结合的模式&#xff0…

盛水最多的容器

题目&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你…

uniapp高德地图ios 使用uni.chooseLocation选取位置显示没有搜索到相关数据

uniapp云打包后&#xff0c;高德地图ios选取位置显示“ 对不起&#xff0c;没有搜索到相关数据” 详细问题描述 废话不多说&#xff0c;直接上图 解决方案 1.打开高德地图开发平台 2.重新创建key 3.获取云打包时的ios报名作为安全码 4.使用生成的高德key更改manifest.json里…

vue项目使用highlight.js 代码高亮插件,并给它添加行数

效果图&#xff1a; 1. 首先封装highlight.js&#xff0c;在main中引入即可使用&#xff0c;./utils/highlight.js 是我的目录 改成自己的; // main中引入语法高亮配置 import Highlight from ./utils/highlight Vue.use(Highlight) 封装&#xff1a; import Vue from vue im…

html+css制作简单注册登录页面

目录 展示图&#xff1a; 设计逻辑&#xff1a; moni.html moni.css 注册登录功能&#xff1a; 展示图&#xff1a; 设计逻辑&#xff1a; 注册{ 注册 用户名 方框&#xff08;请输入用户名&#xff09; 密码 方框&#xff08;请输入密码&#xff09; 已注册&…

『ARM』和『x86』处理器架构解析指南

前言 如果问大家是否知道 CPU&#xff0c;我相信不会得到否定的答案&#xff0c;但是如果继续问大家是否了解 ARM 和 X86 架构&#xff0c;他们的区别又是什么&#xff0c;相信可能部分人就会哑口无言了 目前随着深度学习、高性能计算、NLP、AIGC、GLM、AGI 的技术迭代&#…

代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II

代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II 文章链接&#xff1a;复原IP地址 子集 子集II 视频链接&#xff1a;复原IP地址 子集 子集II 目录 代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP …

【vue3】传送组件、Teleport

把test里的内容传送到test2 //test1.vue <template><div>test1<Teleport v-if"flag" to".aa">test1的内容</Teleport></div></template><script setup langts>import { ref,reactive,onMounted } from vueconst…

[云原生1] Docker网络模式的详细介绍

1. Docker 网络 1.1 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c; Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是每个容器的默认…

D-Link确认数据泄露:员工成为钓鱼攻击受害者

最近&#xff0c;台湾网络设备制造商D-Link确认了一起数据泄露事件&#xff0c;该事件导致公司员工成为钓鱼攻击的受害者。虽然公司表示泄露的数据属于“低敏感度和半公开信息”&#xff0c;但仍引发了公众的关注。让我们来看看事件的详细情况。 导语 近期&#xff0c;台湾网络…

博客系统中的加盐算法

目录 一、为什么要对密码进行加盐加密&#xff1f; 1、明文 2、传统的 MD5 二、加盐加密 1、加盐算法实现思路 2、加盐算法解密思路 3、加盐算法代码实现 三、使用 Spring Security 加盐 1、引入 Spring Security 框架 2、排除 Spring Security 的自动加载 3、调用 S…

python学习7

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

【虹科干货】如何构建弹性、高可用的微服务?

基于微服务的应用程序可实现战略性数字转型和云迁移计划&#xff0c;对于开发团队来说&#xff0c;这种架构十分重要。那么&#xff0c;如何来构建弹性、高可用的微服务呢&#xff1f;Redis Enterprise给出了一个完美的方案。 文况速览&#xff1a; - 什么是微服务架构&#…

介绍argparse的使用【Python标准库】

文章目录 简介argparse标准库的核心功能介绍Python代码示例参考 简介 argparse 模块是Python标准库中的一个模块&#xff0c;用于处理命令行参数解析。它的主要作用是帮助开发者创建命令行界面&#xff0c;允许用户指定运行脚本时的参数&#xff0c;从而定制脚本的行为。本篇博…

1019hw

登录窗口头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QToolBar> #include <QMenuBar> #include <QPushButton> #include <QStatusBar> #include <QLabel> #include <QDockWidget>//浮动窗口…

2023年中国城市交通数智化发展趋势分析:城市交通数智化渗透率将达到31.0% [图]

城市交通数智化是指将自动化技术、信息技术、通信技术、数字化和智能化技术综合应用于城市交通管理领域&#xff0c;建立实时、准确、高效的城市交通管理体系&#xff0c;提升城市交通管理能力和通行效率。城市交通数智化主要应用场景包括在城市道路、交叉口、隧道、快速路、交…

React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的

npm install types/包名称 例如&#xff1a;npm install types/jquery 学习链接