哈希表 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. Handler机制实现原理总结

    Handler一般用于线程间通信,如常用的子线程使用handler让主线程更新UI.那么这是怎么实现的呢? 我们先把这个大问题分解成多个小问题: post();postDelayed();sendMe ...

  2. 数据库系统架构:从HBase到InfluxDB的变革

    目录 数据库系统架构:从 HBase 到 InfluxDB 的变革 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境 ...

  3. React学习时,outlet 路由配置 (prop传参处理,跳转的实现,父子数据共享)

    index.js import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App' ...

  4. GO web学习(三)

    跟着b站https://space.bilibili.com/361469957 杨旭老师学习做的笔记 路由 Controller / Router 角色 main():设置类工作 controlle ...

  5. OpenCV计算机视觉学习(14)——浅谈常见图像后缀(png, jpg, bmp)的区别(opencv读取语义分割mask的坑)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本来 ...

  6. 如何在docker中创建postgresql数据库并使用prisma进行连接

    在docker中创建postgresql # docker 创建 postgres docker pull postgres # 创建容器 # ~/study/db/postgres 是本地的文件映射 ...

  7. BOM和DOM相关API

    一.DOM相关API 1. DOM API DOM(Document Object Model)文档对象模型得树形结构 文档对象模型就是一个树形结构,类似于家谱树 html标签里面包裹了所有的文档内容 ...

  8. Sharding-Sphere使用HikariCP连接池连接Ojdbc6报Driver does not support get/set network timeout for connections. (oracle.jdbc.driver.T4CConnection.getNetworkTimeout()I)

    HikariCP连接Ojdbc6报错Driver does not support get/set network timeout for connections. (oracle.jdbc.driv ...

  9. 一键配置 Linux 环境:zsh + tmux + vim

    默认使用root用户进行安装,整个流程优化过之后,如下 curl -sSL http://119.3.1.43/pub/sh/init-terminal.sh | bash -x # 安装完成之后,重 ...

  10. .Net Core控制台程序读取Json配置文件

    1 添加依赖(可以直接通过nuget包安装 Microsoft.Extensions.Configuration.Json 这个会依赖其他两个会自动安装依赖的) Microsoft.Extension ...