哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,时间复杂度为O(1);而代价仅仅是消耗比较多的内存。

  • 两数之和: https://leetcode-cn.com/problems/two-sum/

    方法二:哈希表
    思路及算法
    创建一个哈希表,对于每一个x,首先查询哈希表中是否存在target-x,然后将x插入到哈希表中,即可保证不会让x 和自己匹配。class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hashtable;   //unordered_map创建一个哈希表for (int i = 0; i < nums.size(); ++i) {auto it = hashtable.find(target - nums[i]);//it 表示的是hashtable的第一整个元素;//it->first 表示的是这个元素的key的值;//it->second 表示的是这个元素的value的值。if (it != hashtable.end()) {return {it->second, i};          //??? it->second不是指向的是value?}hashtable[nums[i]] = i;}return {};}
    };复杂度分析
    时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
    空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。
    
  • 存在重复元素: https://leetcode-cn.com/problems/contains-duplicate/

    class Solution {public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> s;for (int x: nums) {//查找函数 find() 通过给定主键查找元素//如果s.find()要找的值在set中则返回一个指向该值的迭代器,//如果没有找到则返回s.end()。if (s.find(x) != s.end()) {return true;}s.insert(x);}return false;}
    };
    复杂度分析
    时间复杂度:O(N),其中 N 为数组的长度。
    空间复杂度:O(N),其中 N 为数组的长度。
    
  • 最长和谐子序列: https://leetcode-cn.com/problems/longest-harmonious-subsequence/

    方法二:哈希表
    思路与算法遍历数组找出所有的 x 和x+1的出现的次数,用一个哈希映射来存储每个数出现的次数,这样就能在O(1) 的时间内得到x和x+1 出现的次数。我们首先遍历一遍数组,得到哈希映射。随后遍历哈希映射,设当前遍历到的键值对为(x, value),那么我们就查询x+1 在哈希映射中对应的统计次数,就得到了x和x+1 出现的次数,和谐子序列的长度等于 x 和 x+1 出现的次数之和。class Solution {public:int findLHS(vector<int>& nums) {unordered_map<int, int> cnt;int res = 0;for (int num : nums) {cnt[num]++;}for (auto [key, val] : cnt) {if (cnt.count(key + 1)) {res = max(res, val + cnt[key + 1]);}}return res;}
    };复杂度分析
    时间复杂度:O(N),其中N为数组的长度。
    空间复杂度:O(N),其中N为数组的长度。数组中最多有N个不同元素,因此哈希表最多存储N个数据。
    
  • 最长连续序列: https://leetcode-cn.com/problems/longest-consecutive-sequence/

    class Solution {public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;                    //创建一个哈希表for (const int& num : nums) {num_set.insert(num);                      //去掉重复的值}int longestStreak = 0;for (const int& num : num_set) {if (!num_set.count(num - 1)) {       //当存在x-1的数时,则跳过,否则就执行下面当前值加1的操作int currentNum = num;int currentStreak = 1;while (num_set.count(currentNum + 1)) { currentNum += 1;currentStreak += 1;}longestStreak = max(longestStreak, currentStreak);}}return longestStreak;           }
    };
    复杂度分析
    时间复杂度:O(n),其中 n 为数组的长度。
    空间复杂度:O(n)。哈希表存储数组中所有的数需要 O(n) 的空间。
    

【数据结构C++】哈希表(三)相关推荐

  1. C++八股文分享---数据结构其二---哈希表

    C++八股文分享-数据结构其二-哈希表 前言 什么是哈希表? 搜索二叉树对值的查找是通过从根节点开始,逐个节点与目标值做比较,向下查找,直至找到目标值或是到达根节点未查找到,时间复杂度为O(logn) ...

  2. 【数据结构】哈希表的概念及应用

    [数据结构]哈希表的概念及应用 前言 1.写出哈希表的基本概念 2.列出常用的哈希函数构造方法,并阐述各自的特点. 直接定址法 除留余数法 数字分析法 其他构造整数关键字的哈希函数的方法: 平方取中法 ...

  3. 「Redis数据结构」哈希表(Dict)

    「Redis数据结构」哈希表(Dict) 文章目录 「Redis数据结构」哈希表(Dict) @[toc] 一.概述 二.结构 三.哈希冲突 四.链式哈希 五.rehash 六. 渐进式 rehash ...

  4. 用c语言实现基本数据结构(哈希表)

    用c语言实现基本数据结构(哈希表) 写这个哈希表总是段错误,找了半天的bug...原来是各种小错误不断,写得很蛋疼. 我是是用数组实现的,数组的最大值定义成的宏.一共只有四个函数,分别为初始化哈希表, ...

  5. 图书馆管理系统(C、数据结构、哈希表、文件IO)

    目录 技术路线 实现效果展示 ​程序主体 1.头文件部分 2.自定义函数定义部分 3.main函数部分 注意 技术路线 数据结构.哈希表.文件IO 通过C语言进行程序设计,有用到数据结构中的哈希表,通 ...

  6. 数据结构:哈希表函数构造和冲突解决方法

    哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...

  7. 数据结构进阶 哈希表

    作者:@小萌新 专栏:@数据结构进阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:模拟实现高阶数据结构 哈希表 哈希表 哈希桶 哈希概念 举例 哈希冲突 哈希函数 哈希冲突的解决方式之一 ...

  8. 【数据结构】哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

    一.哈希表 1.概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构.它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度.这个 ...

  9. 数据结构之哈希表以及常用哈希的算法表达(含全部代码)

    目录 为什么要有哈希 哈希表 含义 创建哈希表需要注意的点 算法的选择 哈希冲突的处理 线性探测法 再哈希法 链表法 哈希表的实现(代码部分) 确定结构体(节点) 准备一个哈希算法 创建一个哈希表(即 ...

  10. 电话号码查询系统(数据结构之哈希表)

    哈希表 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 1. ...

最新文章

  1. 交换机的基本概念和配置
  2. 时间序列数据库选型——本质是列存储,B-tree索引,抑或是搜索引擎中的倒排索引...
  3. mybaits二十七:spring, spring mvc,mybatis(ssm) 整合
  4. 【全文搜索引擎】Elasticsearch基本查询基础JavaAPI
  5. 每日程序C语言32-取一个整数从右端开始的4-7位
  6. java 桥 word_java导出word的6种方式(转发)
  7. 四平方和(程序设计)
  8. C# WebBrowser控件使用整理
  9. (转载)vmware workstation14永久激活密钥分享
  10. 获取微信中的音频方法
  11. dpdk-pktgen 的安装和基本使用
  12. 以下代码可以屏蔽掉alt+f4
  13. SEO文章图片添加水印,批量SEO文章图片去除水印
  14. 去中心化金融的无常损失
  15. PWM(Pulse Width Modulation)调试原理
  16. 西北工业大学大学物理(I)下期末考试2021-2022选填解析
  17. 仿穷游项目--bug集
  18. Toad for Oracle工具的使用
  19. 水星无线网卡驱动下载
  20. Java 同步、异步

热门文章

  1. 天猫专卖店运营计划书
  2. python3GUI--浏览器By:PyQt5(附源码)
  3. sr里简体中文的代码_各国语言代码大全Locale ID (LCID)表
  4. IDEA社区版下载安装
  5. 怎么清理计算机后台程序,怎么清理电脑应用插件-电脑插件清理的方法 - 河东软件园...
  6. 3D打印gcode命令大全及解析
  7. S7-1200做智能IO设备
  8. 输入流-读取文件内容
  9. iconfont矢量图标在小程序中的使用
  10. CEBIT首现移动电子硬盘,大小如名片