哈希表 part01

今日任务

● 哈希表理论基础

● 242.有效的字母异位词

● 349. 两个数组的交集

● 202. 快乐数

● 1. 两数之和



链表理论基础

文章链接:https://programmercarl.com/哈希表理论基础.html#哈希表

重点:

  1. 哈希表是根据关键码的值而直接进行访问的数据结构。

  2. 一般哈希表都是用来快速判断一个元素是否出现集合里。

  3. 哈希表的关键是哈希函数。哈希函数如下图所示,通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了。

4.哈希函数映射到数组的同一个下标可能会产生哈希碰撞。如图所示,小李和小王都映射到了索引下标 1 的位置,这一现象叫做哈希碰撞。

5.哈希碰撞可以用两种方法解决:第一是拉链法,冲突结点可以转换成链表结构存储。第二是线性检测法,需要有足够大的尺寸,让冲突结点存到其他地方去。

6.C++中的哈希表实现




Problem: 242. 有效的字母异位词

思路

首先我们因为字母是有限个,所以我们可以利用数组去存储。一共26个字母,所以数组大小为26,并且不用记住字母下标,只要计算与'a'的相对距离即可。遍历一遍数组a,遍历一遍数组b,最后我们通过查看结果数组即可判断是否是异位词。

解题方法

哈希表

Code


//时间复杂度: O(n)
//空间复杂度: O(1) class Solution {
public:
bool isAnagram(string s, string t) {
int count[26] ={0};
for(int i = 0; s[i] != '\0';i++){
count[ (int)s[i]-'a']++;
}
for(int i = 0; t[i] != '\0';i++){
count[ (int)t[i]-'a']--;
}
for(int i = 0; i < (sizeof (count) / sizeof (count[0]));i++){
if(count[i] != 0) return false;
} return true;
}
};

Problem: 349. 两个数组的交集

思路

首先,用一个哈希表set去初始化第一个数组,用一个空哈希表专门保存结果数据,然后遍历第二个数组里的所有数字,如果有数字出现在哈希表中就插入结果哈希表中,最后返回这个结果哈希表。

解题方法

哈希表

Code


//时间复杂度: O(mn)
//空间复杂度: O(n) class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end()); for(auto num : nums2){
if(nums_set.find(num) != nums_set.end()){
res.insert(num);
}
}
return vector<int>(res.begin(),res.end());
}
};

Problem: 202. 快乐数

思路

首先我们每求到一个数字的快乐数,先判断这个快乐数曾经在哈希表出现过,如果出现过,那么说明这个数的求快乐数的过程会进入死循环,永远求不到快乐数==1的情况,就立刻返回false。如果没出现过就将该结果插入哈希表。

解题方法

先判断是否重复,再插入,如果有重复直接返回false,快乐数==1退出循环。

Code


//时间复杂度: O(logn)
//空间复杂度: O(logn) class Solution {
public: int getSum(int n){
int sum = 0;
while(n){
sum+=(n%10)*(n%10);
n = n/10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> sum_res;
while(1){
int sum = getSum(n);
if(sum == 1){
return true;
} if(sum_res.find(sum) != sum_res.end()){
return false;
}else{
sum_res.insert(sum);
}
n = sum;
} }
};

Problem: 1. 两数之和

思路

为什么会想到用哈希表?因为当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

哈希表为什么用map?因为我们问题要求我们返回的是下标。

本题map是用来存什么的?键存的是数值,方面find函数查找,值存的的下标,通过迭代器返回。

解题方法

哈希表

Code

/*
用unordered_map不是不能存储两个相同的key吗,那如果数组里两个出现相同的两个元素都要存储会怎么样呢?
注意它存入的方式,它是在循环的过程中边检验边存的,如果没有对应的数字就存入map,如果有就计数,这样不会遇到重复的
*/ //时间复杂度: O(n)
//空间复杂度: O(n) class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> res;//创建一个map用来查找结果
for(int i = 0; i < nums.size(); i++){
//这里必须先判断再插入数据,因为如果先插入的话就会将自己算一遍
auto iter = res.find(target-nums[i]);
if(iter!=res.end()){
return {iter->second,i};
}
else{
res.insert(pair<int,int>(nums[i],i));
}
}
return {};
}
};

算法打卡|Day5 哈希表part01的更多相关文章

  1. Java数据结构和算法(十三)——哈希表

    Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构.它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组.链表 ...

  2. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  3. 数据结构与算法Python版 熟悉哈希表,了解Python字典底层实现

    Hash Table 散列表(hash table)也被称为哈希表,它是一种根据键(key)来存储值(value)的特殊线性结构. 常用于迅速的无序单点查找,其查找速度可达到常数级别的O(1). 散列 ...

  4. Leedcode算法专题训练(哈希表)

    Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中.如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在.例如对于只有小写字符的元素,就可以用一个长度为 2 ...

  5. 磊磊零基础打卡算法:day18 c++模拟哈希表来模拟散列表

    5.21 哈希表 Hash表又称为散列表,一般由Hash函数(散列函数)与链表结构共同实现,与离散化思想类似. 一般要求:防止冲突,便于查询 模拟hash表: 拉链法:两个核心操作insert(),f ...

  6. 哈希表之bkdrhash算法解析及扩展

    BKDRHASH是一种字符哈希算法,像BKDRHash,APHash.DJBHash,JSHash,RSHash.SDBMHash.PJWHash.ELFHash等等,这些都是比較经典的,通过http ...

  7. 【算法】哈希表的诞生(Java)

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  8. Android版数据结构与算法(四):基于哈希表实现HashMap核心源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为 ...

  9. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

  10. java数据结构和算法09(哈希表)

    树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常为O(logN),那有没有更快的数据结构?当然有,那就是哈希 ...

随机推荐

  1. 你还在用Object.equals()方法吗?

    前言 当<阿里巴巴Java开发手册>发布后,我也是仔细进行了阅读,想从中找出一些"标准",让自己的代码质量提高.手册中对 Object 的 equals 方法的使用进行 ...

  2. 曲线艺术编程 coding curves 第六章 平托图 (Pintographs)

    第六章 平托图 (Pintographs) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗( ...

  3. 罕见的技术:MSIL的机器码简析

    前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机 ...

  4. Go语言中的原子操作

    1. 引言 在并发编程中,多个协程同时访问和修改共享数据时,如果没有使用适当的机制来防止并发问题,这个时候可能导致不确定的结果.数据不一致性.逻辑错误等严重后果. 而原子操作是解决并发编程中共享数据访 ...

  5. JavaWeb技术栈图(web服务器+web容器是何物)

    JavaWeb技术栈图(web服务器+web容器是何物) 两个重要概念web服务器+web容器 什么是Web服务器? Tomcat 服务器就是一个免费的开放源代码的 Web 应用服务器 web服务实际 ...

  6. 跟着 GPT-4 从0到1学习 Golang 并发机制(二)

    btw: 我的个人博客网站 目录 一.前言 二.开聊 2.1 Golang 中的 sync 包 - Mutex, RWMutex 和 WaitGroup 2.2 条件变量 sync.Cond 2.3 ...

  7. Istio 入门(五):访问控制和流量管理

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 4, 流量管理 基于版本的路由配置 基于 Http header 的路由配置 故障注入 两种故障注入 比例分配流 ...

  8. 开源BaaS平台Supabase介绍

    Supabase 介绍 Supabase 是一个开源的 Firebase 替代品,以BaaS的形式向各种应用程序提供了一系列的后端功能,可以帮助开发者更快地构建产品. 对于想快速实现一个产品而言,如果 ...

  9. Word书签替换,加盖电子印章及转换PDF(Java实用版)

    一.前言 在项目中有需要对word进行操作的,可以看看哈,本次使用比较强大的spire组件来对word进行操作,免费版支持三页哦,对于不止三页的word文件,可以购买收费版,官网:https://ww ...

  10. loopback4:单元测试冻结时间

    解决方案 import {expect} from '@loopback/testlab'; import sinon from 'sinon'; describe('example test', ( ...