哈希表相关的力扣题和讲解和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的题
      • 349. 两个数组的交集
    • 350. 两个数组的交集 II(对于给定范围了,而且重复的,先考虑数组,因为会快很多)
      • 数组
      • HashMap

(来源于代码随想录)

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

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的题

349. 两个数组的交集

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

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

使用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;}
}

350. 两个数组的交集 II(对于给定范围了,而且重复的,先考虑数组,因为会快很多)

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

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

数组

class Solution {public int[] intersect(int[] nums1, int[] nums2) {int[] counter1 = new int[1001];int[] counter2 = new int[1001];for (int num : nums1) {counter1[num]++;}int index = 0;for (int num : nums2) {if (counter1[num] > 0) {counter1[num]--;counter2[index] = num;index++;}}return Arrays.copyOfRange(counter2, 0, index);}
}

HashMap

class Solution {public int[] intersect(int[] nums1, int[] nums2) {if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {return new int[0];}HashMap<Integer, Integer> map = new HashMap<>();List<Integer> resultList = new ArrayList<>();// 记录 nums1 中每个元素的出现次数for (int num : nums1) {map.put(num, map.getOrDefault(num, 0) + 1);}// 遍历 nums2,检查元素是否在 map 中,并更新结果for (int num : nums2) {if (map.containsKey(num) && map.get(num) > 0) {resultList.add(num);map.put(num, map.get(num) - 1);}}// 将结果 List 转换为数组return resultList.stream().mapToInt(i -> i).toArray();}}

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

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

相关文章

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日&#xff0c;第13届PostgreSQL中国技术大会在杭州顺利举办&#xff0c;亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上&#xff0c;亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…

vue3前端架构---打包配置

最近看到几篇vue3配置项的文章&#xff0c;转载记录一下 Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案-CSDN博客文章浏览阅读2k次&#xff0c;点赞8次&#xff0c;收藏9次。Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页…

【企业级开发模型】Git分支设计模型 | 企业级项目挂历实战_准备工作开发场景实操

目录 3.Git分支设计模型 3.1master分支 3.2release分支 3.3develop分支 3.4feature分支 3.5hotfix分支 4.企业级项目挂历实战_准备工作&开发场景实操学习文档 3.Git分支设计模型 对于我们开发人员来说&#xff0c;对于不同的场景/环境&#xff0c;来设计分支模型。…

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …

企元数智引领新零售合规分销系统免费送

企元数智近日宣布推出全新的新零售合规分销系统&#xff0c;并免费向企业提供这一创新解决方案。这一举措旨在帮助更多企业实现数字化转型&#xff0c;提高管理效率&#xff0c;促进业务增长。 新零售合规分销系统是企元数智引领的一项全新数字解决方案&#xff0c;涵盖了销售数…

华为强制恢复出厂设置后如何恢复数据?数据重生的2个方法介绍

华为作为全球知名的手机品牌&#xff0c;其产品在市场上广受欢迎。然而&#xff0c;有时由于各种原因&#xff0c;我们可能需要强制恢复出厂设置&#xff0c;这往往意味着数据的丢失。那么&#xff0c;如何在华为强制恢复出厂设置后&#xff0c;让数据“重生”呢&#xff1f;本…

通信类IEEE会议——第四届通信技术与信息科技国际学术会议(ICCTIT 2024)

[IEEE 独立出版&#xff0c;中山大学主办&#xff0c;往届均已见刊检索] 第四届通信技术与信息科技国际学术会议&#xff08;ICCTIT 2024&#xff09; 2024 4th International Conference on Communication Technology and Information Technology 重要信息 大会官网&#xf…

ETL数据集成丨将PostgreSQL数据库数据实时同步至PostgreSQL

前言 我们在进行数据集成、实时数据同步中&#xff0c;经常会出现在同一个数据库中做数据同步和复制、实时分析和报告、负载均衡和高可用性等场景&#xff0c;这次我们以PostgreSQL为例&#xff0c;通过ETLCloud工具&#xff0c;进行同数据库中数据实时同步的步骤应该如何设置…

无人机组装与操作实训课程详解

一、课程名称与目标 课程名称&#xff1a;无人机组装与操作实训课程 课程目标&#xff1a;本课程旨在培养学员对无人机组装技术的深入理解和实际操作能力&#xff0c;使学员能够独立完成无人机的组装、调试和日常维护工作&#xff0c;并具备一定的无人机操作能力和安全意识。…

ZStack Cloud 5.1.8正式发布——GPU运维、物理机硬件监控、克隆云主机网络配置三大亮点简析

云轴科技ZStack Cloud云平台是遵循“简单、弹性、健壮、智能”的“4S”特性的私有云和无缝混合云产品。ZStack Cloud 5.1.8版本正式发布&#xff0c;从用户业务场景和实际需求出发&#xff0c;丰富和完善平台功能&#xff0c;推出一系列重要功能和多项改进&#xff0c;覆盖云主…

ElasticSearch(五)— 文本分析与分词

一、文本分析 文本分析( analysis )是在文档被发送并加入倒排索引之前&#xff0c;Elasticsearch 在其主体上进行的操作。在文档被加入索引之前&#xff0c;Elasticsearch 让每个被分析字段经过一系列的处理步骤。 字符过滤–使用字符过滤器转变字符。文本切分为分词—将文本…

视频怎么加密?常见的四种视频加密方法和软件

视频加密是一种重要的技术手段&#xff0c;用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中&#xff0c;安企神软件作为一种专业的加密工具&#xff0c;可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密&#xff0c;并探讨视频加密…

HTTP传输下载和P2P传输下载的区别?

HTTP传输下载和P2P&#xff08;Peer-to-Peer&#xff09;传输下载在多个方面存在显著的区别&#xff0c;以下是详细的分析&#xff1a; 1. 工作原理 HTTP传输下载&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在Web上进行数据通信的协议&…

Linux中为qt添加opencv

一. 安装OpenCV库&#xff1a; 打开终端&#xff0c;输入以下命令安装OpenCV&#xff1a; sudo apt-get update sudo apt-get install libopencv-dev二. 配置Qt项目 在Qt Creator中打开项目&#xff0c;然后编辑.pro文件&#xff0c;添加以下内容&#xff1a; INCLUDEPATH …

图像生成中图像质量评估指标—PSNR的详细介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 峰值信噪比&#xff08;Peak Signal-to-Noise Ratio&#xff0c;简称PSNR&#xff09;是一种广泛应用于图像和视频处理领域的客观图像质量评价指标。它主要用于衡量图像的噪声水平和图像质量&#xff0c;可以用来评…

PySide(PyQt)使用QPropertyAnimation制作动态界面

主脚本&#xff1a; # encoding: utf-8 import os import sysfrom PySide6.QtCore import QPropertyAnimation, QEasingCurvefrom UIS import *# 主画面类 class MainWindow(QMainWindow, animationButton_ui.Ui_MainWindow):def __init__(self):super().__init__()self.setup…

基于FPGA读写AT24C256 EEPROM芯片

在FPGA上面根据IIC接口协议用verilog语言读写AT24C256 EEPROM芯片 目录 前言 一、EEPROM简介 二、管脚信息 三、IIC协议 四、读写模式 五、字节写 六、随机地址读 七、参考资料 总结 前言 EEPROM (E2PROM&#xff0c;Electrically Erasable Progammable Read Only Mem…

基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 粒子群优化算法&#xff08;PSO&#xff09; 4.2 分组卷积神经网络&#xff08;GroupCNN&#xff09; 4.3 PSO优化GroupCNN 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行…

Golang实现Word模板内容填充导出

这里我们使用一个广泛使用且免费处理 .docx 文件的库&#xff0c;github.com/nguyenthenguyen/docx. 安装 github.com/nguyenthenguyen/docx 库 首先&#xff0c;确保你已经安装了 docx 库&#xff1a; go get github.com/nguyenthenguyen/docx使用 docx 库处理 Word 模板 …

【odoo17 | Owl】前端js钩子调用列表选择视图

概要 在我们选择多对一或者多对多字段的时候&#xff0c;经常看到可以弹出列表弹窗让人一目了然的效果&#xff0c;效果如下&#xff1a; 那么&#xff0c;这种效果是odoo本身封装好的组件&#xff0c;我们在平时的前端界面开发的时候&#xff0c;既不是后端视图的情况下&#…