【数据结构C++】哈希表(三)
哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,时间复杂度为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++】哈希表(三)相关推荐
- C++八股文分享---数据结构其二---哈希表
C++八股文分享-数据结构其二-哈希表 前言 什么是哈希表? 搜索二叉树对值的查找是通过从根节点开始,逐个节点与目标值做比较,向下查找,直至找到目标值或是到达根节点未查找到,时间复杂度为O(logn) ...
- 【数据结构】哈希表的概念及应用
[数据结构]哈希表的概念及应用 前言 1.写出哈希表的基本概念 2.列出常用的哈希函数构造方法,并阐述各自的特点. 直接定址法 除留余数法 数字分析法 其他构造整数关键字的哈希函数的方法: 平方取中法 ...
- 「Redis数据结构」哈希表(Dict)
「Redis数据结构」哈希表(Dict) 文章目录 「Redis数据结构」哈希表(Dict) @[toc] 一.概述 二.结构 三.哈希冲突 四.链式哈希 五.rehash 六. 渐进式 rehash ...
- 用c语言实现基本数据结构(哈希表)
用c语言实现基本数据结构(哈希表) 写这个哈希表总是段错误,找了半天的bug...原来是各种小错误不断,写得很蛋疼. 我是是用数组实现的,数组的最大值定义成的宏.一共只有四个函数,分别为初始化哈希表, ...
- 图书馆管理系统(C、数据结构、哈希表、文件IO)
目录 技术路线 实现效果展示 程序主体 1.头文件部分 2.自定义函数定义部分 3.main函数部分 注意 技术路线 数据结构.哈希表.文件IO 通过C语言进行程序设计,有用到数据结构中的哈希表,通 ...
- 数据结构:哈希表函数构造和冲突解决方法
哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...
- 数据结构进阶 哈希表
作者:@小萌新 专栏:@数据结构进阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:模拟实现高阶数据结构 哈希表 哈希表 哈希桶 哈希概念 举例 哈希冲突 哈希函数 哈希冲突的解决方式之一 ...
- 【数据结构】哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度
一.哈希表 1.概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构.它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度.这个 ...
- 数据结构之哈希表以及常用哈希的算法表达(含全部代码)
目录 为什么要有哈希 哈希表 含义 创建哈希表需要注意的点 算法的选择 哈希冲突的处理 线性探测法 再哈希法 链表法 哈希表的实现(代码部分) 确定结构体(节点) 准备一个哈希算法 创建一个哈希表(即 ...
- 电话号码查询系统(数据结构之哈希表)
哈希表 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 1. ...
最新文章
- 交换机的基本概念和配置
- 时间序列数据库选型——本质是列存储,B-tree索引,抑或是搜索引擎中的倒排索引...
- mybaits二十七:spring, spring mvc,mybatis(ssm) 整合
- 【全文搜索引擎】Elasticsearch基本查询基础JavaAPI
- 每日程序C语言32-取一个整数从右端开始的4-7位
- java 桥 word_java导出word的6种方式(转发)
- 四平方和(程序设计)
- C# WebBrowser控件使用整理
- (转载)vmware workstation14永久激活密钥分享
- 获取微信中的音频方法
- dpdk-pktgen 的安装和基本使用
- 以下代码可以屏蔽掉alt+f4
- SEO文章图片添加水印,批量SEO文章图片去除水印
- 去中心化金融的无常损失
- PWM(Pulse Width Modulation)调试原理
- 西北工业大学大学物理(I)下期末考试2021-2022选填解析
- 仿穷游项目--bug集
- Toad for Oracle工具的使用
- 水星无线网卡驱动下载
- Java 同步、异步