哈希表相关的力扣题和讲解和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 操作通过二进制日志…

Dubbo 参数调优指南

在现代微服务架构中&#xff0c;Apache Dubbo 是一款高性能的 Java RPC 框架&#xff0c;它提供了丰富的功能来支持大规模分布式系统的构建。为了确保 Dubbo 服务能够在高并发环境中稳定运行&#xff0c;性能调优是不可忽视的重要环节。本文将深入探讨 Dubbo 的参数调优策略&am…

【知识图谱】人工智能之知识图谱的详细介绍

知识图谱&#xff08;Knowledge Graph&#xff09;作为一种新型的知识表示和组织方式&#xff0c;正逐渐成为信息领域的研究热点。以下是对知识图谱的详细介绍&#xff1a; 一、定义与概念 知识图谱以结构化的形式描述客观世界中概念、实体及其关系&#xff0c;将互联网的信息…

uniapp实现表格的多选功能

记录一下最近在做一个的表格数据多选功能。需求大致为支持多选、支持跨分页的连续选择、支持通过查询框后手动选择数据&#xff08;我是后端选手&#xff0c;前端不太熟悉单纯记录~&#xff09;。 主要思路为&#xff1a; 将table中的唯一id&#xff0c;存入数组tableIds中进…

金融业的等保测评实践与成效:以实际案例为鉴

在数字化浪潮席卷全球的今天&#xff0c;金融业作为信息密集型的行业&#xff0c;其信息安全与业务连续性面临着前所未有的挑战。为了确保金融数据的安全性和业务的稳健运行&#xff0c;金融业积极响应国家信息安全等级保护制度&#xff08;简称“等保”&#xff09;&#xff0…

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年提出&…

【组件协作】模板方法

文章目录 模板方法总体划分重构组件协作模式——模板方法动机代码——做法一代码——做法二对比定义缺点总结 其他 模板方法 总体划分 设计模式的总体分类&#xff1a; 目的&#xff1a; 创建型&#xff1a;解决对象创建的工作结构型&#xff1a;对象在需求变化对结构的冲击…

编写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…

[Day 35] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的分布式存儲技術 區塊鏈技術自2008年比特幣白皮書發表以來&#xff0c;已經成為一種革命性的技術&#xff0c;帶來了許多創新。區塊鏈本質上是一個去中心化的分布式賬本&#xff0c;每個節點都持有賬本的副本&#xff0c;並參與記錄和驗證交易。分布式存儲是區塊鏈的重…

在SAP中创建主数据的常用BAPI

科目主数据: BAPI_FINANCIAL_ACCOUNTING_DOCUMENT_CREATE &#xff1a;用于创建财务会计凭证。 成本中心: BAPI_COSTCENTER_CREATEMULTIPLE &#xff1a;用于创建多个成本中心。BAPI_COSTCENTER_CHANGEMULTIPLE &#xff1a;用于修改多个成本中心。 利润中心: BAPI_PROFITCEN…

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

目录 主要内容 电池管理技术概述 电池的工作原理与关键性能指标 电池管理系统的核心功能 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…

力扣第三十三题——搜索旋转排序数组

内容介绍 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], num…