【刷题总结】哈希系列问题

文章目录

  • 一、算法解析
  • 二、解题模板
    • 1、C++ 内相关API
    • 2、使用哈希集合查重
  • 三、哈希系列问题
    • 1、哈希表设计
    • 2、去重\判重问题(哈希集合)
      • (1)重复元素查找
      • (2)几数之和
      • (3)求交集
      • (4)是否循环问题
      • (5)判断是否存在
    • 3、构造哈希表
      • (1)键---下标
      • (2)键 --- 统计个数
      • (3)字母 --- 单词(字典映射)
    • (5)其他
    • 4、滑动窗口类问题(哈希映射)
    • 5、哈希设计键
      • (1)排序后字符串/数组为key
      • (2)指针/节点作为key
      • (3)矩阵中索引作为key
      • (4)带掩码的字符串作为key
    • 6、前缀和 + hash问题

一、算法解析

有两种不同类型的哈希表:哈希集合和哈希映射。

  • 哈希集合集合数据结构的实现之一,用于存储非重复值
  • 哈希映射映射 数据结构的实现之一,用于存储(key, value)键值对

哈希表的关键思想是使用哈希函数将键映射到存储桶。更确切地说,

  1. 插入一个新的键时,哈希函数将决定该键应该分配到哪个桶中,并将该键存储在相应的桶中;

  2. 想要搜索一个键时,哈希表将使用相同的哈希函数来查找对应的桶,并只在特定的桶中进行搜索。哈希表是一种使用 哈希函数组织数据,以支持快速插入和搜索的数据结构。

负载因子:负载因子又叫装填因子,是哈希表的一个重要参数,它反映了哈希表的装满程度。实际利用桶的个数 与 桶的总数 的比值,称为负载因子。随着插入的数据量的增加,计算机会逐渐增加桶的个数,并选择合适的哈希函数,使得数据经过映射之后能均匀地分布在桶中

二、解题模板

1、C++ 内相关API

- unordered_set 无序的set
- unordered_map 无序的map
- set 按key排序的set
- map 按key排序的map

(1)哈希集合

哈希集合是集合的实现方式之一,采用set/ unordered_set实现,它是一种存储 不重复值 的数据结构。

#include                

int main() {
    // 1. 初始化哈希集
    unordered_set hashset;   
    // 2. 新增键
    hashset.insert(3);
    hashset.insert(2);
    hashset.insert(1);
    // 3. 删除键
    hashset.erase(2);
    // 4. 查询键是否包含在哈希集合中
    if (hashset.count(2) <= 0) {
        cout << "键 2 不在哈希集合中" << endl;
    }
    // 5. 哈希集合的大小
    cout << "哈希集合的大小为: " << hashset.size() << endl; 
    // 6. 遍历哈希集合
    for (auto it = hashset.begin(); it != hashset.end(); ++it) {
        cout << (*it) << " ";
    }
    cout << "在哈希集合中" << endl;
    // 7. 清空哈希集合
    hashset.clear();
    // 8. 查看哈希集合是否为空
    if (hashset.empty()) {
        cout << "哈希集合为空!" << endl;
    }
}

(2)哈希映射

哈希表的操作:哈希表 是用来存储 (key, value) 键值对的一种实现。用map/unordered_map实现

#include                 

int main() {
    // 1. 初始化哈希表
    unordered_map hashmap;
    // 2. 插入一个新的(键,值)对
    hashmap.insert(make_pair(0, 0));
    hashmap.insert(make_pair(2, 3));
    // 3. 插入一个新的(键,值)对,或者更新值
    hashmap[1] = 1;
    hashmap[1] = 2;
    // 4. 获得特定键对应的值
    cout << "The value of key 1 is: " << hashmap[1] << endl;
    // 5. 删除键
    hashmap.erase(2);
    // 6. 检查键是否存在于哈希表中
    if (hashmap.count(2) <= 0) {
        cout << "键 2 不在哈希表中" << endl;
    }
    // 7. 哈希表的大小
    cout << "哈希表的大小为: " << hashmap.size() << endl; 
    // 8. 遍历哈希表
    for (auto it = hashmap.begin(); it != hashmap.end(); ++it) {
        cout << "(" << it->first << "," << it->second << ") ";
    }
    cout << "在哈希表中" << endl;
    // 9. 清空哈希表
    hashmap.clear();
    // 10. 检查哈希表是否为空
    if (hashmap.empty()) {
        cout << "哈希表为空!" << endl;
    }
}

2、使用哈希集合查重

由于哈希集合中的元素是 不重复的,因此可以使用哈希集合来判断是否包含重复元素。伪代码模板:

//使用哈希集合寻找重复元素的模板
bool findDuplicates(vector& keys) {
    // 将 type 替换为 keys 的实际类型
    unordered_set hashs

你可能感兴趣的:(刷题总结,LeetCode)