哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)

20240725

  • 一、什么时候适用什么样的结构。
    • 1.java中
      • 1.1 HashSet:
      • 1.2 TreeSet:
      • 1.3 LinkedHashSet:
      • 1.4 HashMap:
      • 1.5 TreeMap:
      • 1.6 LinkedHashMap:
      • 1.7 总结
    • 2. c++中
      • 2.1 std::unordered_set:
      • 2.2 std::set:
      • 2.3 std::multiset:
      • 2.4 std::unordered_map:
      • 2.5 std::map:
      • 2.6 std::multimap:
    • 3 代码随想录中对与哈希法的总结
  • 二、题目和讲解
    • 1 用数组
      • 242. 有效的字母异位词
      • 383. 赎金信
    • 2. 用set的题
      • 350. 两个数组的交集 II

(来源于代码随想录)

一、什么时候适用什么样的结构。

1.java中

Java 中的数据结构及其使用场景

1.1 HashSet:

底层实现:哈希表。
特点:无序集合,元素唯一。
使用场景:
需要快速查找、插入和删除操作,并且不关心元素的顺序。
适合于需要去重的集合,例如存储唯一的用户ID或配置项。

1.2 TreeSet:

底层实现:红黑树。
特点:有序集合,元素唯一,按自然顺序或指定的比较器排序。
使用场景:
需要保持元素的排序,并且需要高效的顺序相关操作(如范围查询)。
适合于需要有序集合的应用场景,例如任务调度系统或有序数据处理。

1.3 LinkedHashSet:

底层实现:哈希表和双向链表。
特点:保持插入顺序的无序集合,元素唯一。
使用场景:
需要保持元素的插入顺序,并且需要高效的查找、插入和删除操作。
适合于需要插入顺序的集合,如实现缓存机制或历史记录功能。

1.4 HashMap:

底层实现:哈希表。
特点:无序的键值对集合,键唯一,值可以重复。
使用场景:
需要高效的键值对查找、插入和删除操作,不关心键值对的顺序。
适合于实现字典、缓存、配置管理等场景。

1.5 TreeMap:

底层实现:红黑树。
特点:有序的键值对集合,键唯一,按键的自然顺序或指定的比较器排序。
使用场景:
需要保持键的有序性,并进行高效的范围查询操作。
适合于需要按键排序的场景,例如实现排序的配置项存储或基于键的范围查询。

1.6 LinkedHashMap:

底层实现:哈希表和双向链表。
特点:保持插入顺序的键值对集合,键唯一。
使用场景:
需要保持插入顺序,并且需要高效的键值对查找、插入和删除操作。
适合于实现有序缓存(如最近最少使用缓存)或需要记录插入顺序的映射。

1.7 总结

HashSet 和 HashMap 提供了基于哈希的高效查找和操作,适合不关心顺序的场景。
TreeSet 和 TreeMap 提供了基于红黑树的有序操作,适合需要排序和范围查询的场景。
LinkedHashSet 和 LinkedHashMap 提供了保持插入顺序的功能,适合需要记录元素插入顺序的场景。

2. c++中

2.1 std::unordered_set:

底层实现:哈希表。
特点:无序集合,提供常数时间复杂度的平均增、删、查操作。
适用场景:当需要高效的查找操作,并且元素的顺序无关紧要时使用。

2.2 std::set:

底层实现:红黑树(平衡二叉搜索树)。
特点:有序集合,元素按照一定顺序存储,提供对数时间复杂度的增、删、查操作。
适用场景:当需要有序集合,且集合中不允许重复元素时使用。

2.3 std::multiset:

底层实现:红黑树(平衡二叉搜索树)。
特点:有序集合,允许重复元素。
适用场景:当需要有序集合,并且允许重复元素时使用。

2.4 std::unordered_map:

底层实现:哈希表。
特点:无序的键值对集合,提供常数时间复杂度的平均增、删、查操作。
适用场景:当需要高效的键值对查找,且键值对的顺序无关紧要时使用。

2.5 std::map:

底层实现:红黑树(平衡二叉搜索树)。
特点:有序的键值对集合,键是唯一的,提供对数时间复杂度的增、删、查操作。
适用场景:当需要有序的键值对集合,并且键值对的顺序是重要的时使用。

2.6 std::multimap:

底层实现:红黑树(平衡二叉搜索树)。
特点:有序的键值对集合,键允许重复,提供对数时间复杂度的增、删、查操作。
适用场景:当需要有序的键值对集合,并且允许键重复时使用。

3 代码随想录中对与哈希法的总结

在这里插入图片描述
在这里插入图片描述

二、题目和讲解

1 用数组

242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

/*** 242. 有效的字母异位词 字典解法* 时间复杂度O(m+n) 空间复杂度O(1)*/
class Solution {public boolean isAnagram(String s, String t) {int[] record = new int[26];for (int i = 0; i < s.length(); i++) {record[s.charAt(i) - 'a']++;     // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了}for (int i = 0; i < t.length(); i++) {record[t.charAt(i) - 'a']--;}for (int count: record) {if (count != 0) {               // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。return false;}}return true;                        // record数组所有元素都为零0,说明字符串s和t是字母异位词}
}

383. 赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] arr=new int[26];for(int i=0;i<magazine.length();++i){arr[magazine.charAt(i)-'a']++;}for(int i=0;i<ransomNote.length();++i){arr[ransomNote.charAt(i)-'a']--;}for(int a:arr){if(a<0){return false;}}return true;}
}

2. 用set的题

350. 两个数组的交集 II

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

使用HashSetimport java.util.HashSet;
import java.util.Set;class Solution {public int[] intersection(int[] nums1, int[] nums2) {if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {return new int[0];}Set<Integer> set1 = new HashSet<>();Set<Integer> resSet = new HashSet<>();//遍历数组1for (int i : nums1) {set1.add(i);}//遍历数组2的过程中判断哈希表中是否存在该元素for (int i : nums2) {if (set1.contains(i)) {resSet.add(i);}}//方法1:将结果集合转为数组return resSet.stream().mapToInt(x -> x).toArray();//方法2:另外申请一个数组存放setRes中的元素,最后返回数组int[] arr = new int[resSet.size()];int j = 0;for(int i : resSet){arr[j++] = i;}return arr;}
}
使用Hash数组class Solution {public int[] intersection(int[] nums1, int[] nums2) {int[] hash1 = new int[1002];int[] hash2 = new int[1002];for(int i : nums1)//将nums1出现的数字次数进行存储hash1[i]++;for(int i : nums2)hash2[i]++;List<Integer> resList = new ArrayList<>();for(int i = 0; i < 1002; i++)if(hash1[i] > 0 && hash2[i] > 0)//如果i都大于0,证明都都存在,所以直接添加到List集合。resList.add(i);int index = 0;int res[] = new int[resList.size()];for(int i : resList)//返回数组,所以转为数组res[index++] = i;return res;}
}

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

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

相关文章

项目实战——外挂开发(30小时精通C++和外挂实战)

项目实战——外挂开发&#xff08;30小时精通C和外挂实战&#xff09; 外挂开发1-监控游戏外挂开发2-秒杀僵尸外挂开发3-阳光地址分析外挂开发4-模拟阳光外挂开发5-无限阳光 外挂开发1-监控游戏 外挂的本质 有两种方式 1&#xff0c;修改内存中的数据 2&#xff0c;更改内存中…

谷粒商城实战笔记-54-商品服务-API-三级分类-拖拽效果

文章目录 一&#xff0c;54-商品服务-API-三级分类-修改-拖拽效果1&#xff0c;el-tree控件加上允许拖拽的属性2&#xff0c;是否允许拖拽3&#xff0c;完整代码 一&#xff0c;54-商品服务-API-三级分类-修改-拖拽效果 本节的主要内容是给三级分类树形结构加上拖拽功能&#…

Mysql 集群搭建 05

文章目录 1. Mysql主从复制集群搭建1.1 主库配置1.2 从库配置 2. 分库分表2.1 拆分策略2.2 实现技术2.2.1 MyCat概述2.2.2 MyCat入门2.2.3 配置 schema.xml 3. 双主双从4. 双主双从读写分离 1. Mysql主从复制集群搭建 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志…

VMware Cloud Foundation ESXi 主机

一、准备嵌套 ESXi 主机环境# 1)物理 ESXi 主机信息 本次准备用于部署 VCF 嵌套实验环境的物理宿主机的配置信息如下图所示。其实,部署 VCF 环境主要对内存的大小要求比较高,部署完整的管理域相关组件下来差不多就要占用 200 GB左右内存,而对 CPU 和存储的需求可以根据实…

Pytorch使用教学8-张量的科学运算

在介绍完PyTorch中的广播运算后&#xff0c;继续为大家介绍PyTorch的内置数学运算&#xff1a; 首先对内置函数有一个功能印象&#xff0c;知道它的存在&#xff0c;使用时再查具体怎么用其次&#xff0c;我还会介绍PyTorch科学运算的注意事项与一些实用小技巧 1 基本数学运算…

idea中项目目录,文件显示不全问题

问题&#xff1a;idea中项目目录显示不全问题 解决办法1&#xff1a; 删除目录中的.idea文件 用idea重新打开文件就行了 办法2&#xff1a;手动导入为maven项目 1. 2. 3. 4.选择要导入的项目&#xff0c;导入为maven

在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具。在 2023 年国际机器学习会议 (ICML) 上&#xff0c;MILA 和英特尔实验室联合发布了ProtST模型&#xff0c;该模型是个可基于文本提示设计蛋白质的多模态模型。此后&#xff0…

昇思25天学习打卡营第22天|Pix2Pix实现图像转换

Pix2Pix图像转换学习总结 概述 Pix2Pix是一种基于条件生成对抗网络&#xff08;cGAN&#xff09;的深度学习模型&#xff0c;旨在实现不同图像风格之间的转换&#xff0c;如从语义标签到真实图像、灰度图到彩色图、航拍图到地图等。这一模型由Phillip Isola等人在2017年提出&…

编写Hello World!,开启cpp人生

一、具体步骤 1.、安装Visual Studio2019(网上教程很多&#xff09;并打开。 2、新建项目 首先配置新项目 其中 解决方案包含项目 然后添加cpp文件并编写代码 代码如下 #include <iostream> using namespace std; int main() {cout << "Hello World~&qu…

electron TodoList网页应用打包成linux deb、AppImage应用

这里用的是windows的wsl的ubuntu环境 electron应用打包linux应用需要linux下打包&#xff0c;这里用windows的wsl的ubuntu环境进行操作 1&#xff09;linux ubuntu安装nodejs、electron 安装nodejs&#xff1a; sudo apt update sudo apt upgrade ##快捷安装 curl -fsSL http…

机器学习驱动的智能化电池管理技术与应用

目录 主要内容 电池管理技术概述 电池的工作原理与关键性能指标 电池管理系统的核心功能 SOC估计 SOH估计 寿命预测 故障诊断 人工智能机器学习 基础 人工智能的发展 机器学习的关键概念 机器学习在电池管理中的应用案例介绍 人工智能在电池荷电状态估计中的…

小猪佩奇.js

闲着没事 使用js 画一个小猪佩奇把 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

UDP/TCP协议解析

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

Elasticsearch:跨集群使用 ES|QL

警告&#xff1a;ES|QL 的跨集群搜索目前处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。Elastic 将努力解决任何问题&#xff0c;但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。 使用 ES|QL&#xff0c;你可以跨多个集群执行单个查询。 前提&#xff1a; …

实战解读:Llama Guard 3 Prompt Guard

前序研究&#xff1a;实战解读&#xff1a;Llama 3 安全性对抗分析 近日&#xff0c;腾讯朱雀实验室又针对 Llama 3.1 安全性做了进一步解读。 2024年7月23日晚&#xff0c;随着Llama3.1的发布&#xff0c;Meta正式提出了“Llama系统”的概念&#xff0c;通过系统级的安全组件对…

谷粒商城实战笔记-62-商品服务-API-品牌管理-OSS整合测试

文章目录 一&#xff0c;Java中上传文件到阿里云OSS1&#xff0c;整合阿里云OSS2&#xff0c;测试上传文件 二&#xff0c;Java中整合阿里云OSS服务指南引言准备工作1. 注册阿里云账号2. 获取Access Key3. 添加依赖 实现OSS客户端1. 初始化OSSClient2. 创建Bucket3. 上传文件4.…

自定义 RAG 工作流:在 IDE 中结合 RAG 编排,构建可信的编码智能体

构建编码智能体并非一件容易的事。结合我们在 AutoDev、ArchGuard Co-mate、ChocoBuilder 等智能体项目的经验&#xff0c;我们开始思考在 Shire 语言中提供一种新的 RAG 工作流。结合我们先前构建的 IDE 基础设施&#xff08;代码生成、代码校验、代码执行等接口&#xff09;&…

基于PaddleClas的人物年龄分类项目

目录 一、任务概述 二、算法研发 2.1 下载数据集 2.2 数据集预处理 2.3 安装PaddleClas套件 2.4 算法训练 2.5 静态图导出 2.6 静态图推理 三、小结 一、任务概述 最近遇到个需求&#xff0c;需要将图像中的人物区分为成人和小孩&#xff0c;这是一个典型的二分类问题…

Leetcode3219. 切蛋糕的最小总开销 II

Every day a Leetcode 题目来源&#xff1a;3219. 切蛋糕的最小总开销 II 解法1&#xff1a;贪心 谁的开销更大&#xff0c;就先切谁&#xff0c;并且这个先后顺序与切的次数无关。 代码&#xff1a; /** lc appleetcode.cn id3219 langcpp** [3219] 切蛋糕的最小总开销 I…

【SQL 新手教程 1/20】SQL语言MySQL数据库 简介

&#x1f497; 什么是SQL&#xff1f;⭐ (Structured Query Language) 结构化查询语言&#xff0c;是访问和处理关系数据库的计算机标准语言 无论用什么编程语言&#xff08;Java、Python、C……&#xff09;编写程序&#xff0c;只要涉及到操作关系数据库都必须通过SQL来完成 …