C++算法:哈希表(简介|两数之和|判断是否互为字符重排)

上篇文章:力扣题型--链表(合并K个升序链表|K个一组翻转链表)

目录

1.哈希表简介

1.1哈希表是什么

1.2作用

1.3什么时候用

1.4怎么用

2.两数之和

算法原理

解法一:暴力解法

解法二:哈希表

3.判断是否互为字符重排

算法原理


1.哈希表简介

1.1哈希表是什么

存储数据的容器

1.2作用

"快速"查找某个元素(O(1)时间复杂度)

1.3什么时候用

频繁的查找某一个数时(也可以想到二分)

1.4怎么用

  1. 容器(哈希表)
  2. 用数组模拟简易哈希表:
    1. 查找字符串中的"字符"
    2. 数据范围很小时

2.两数之和

https://leetcode.cn/problems/two-sum/description/

算法原理

解法一:暴力解法

固定一个数,使其与它之前的数相加

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int sum = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            for(int j = 0; j < i; j++)
            {
                sum = nums[i] + nums[j];
                if(sum == target) return{j, i};
            }
        }
        return { };
    }
};

解法二:哈希表

优化前面的"和之前的数相加",其完美适配哈希表"边遍历,边存储"的特性,并且可以规避"用同一个元素"的坑,匹配永远是j < i,绝不会用到自己nums[i]。

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hash;
        for(int i = 0; i < nums.size(); i++)
        {
            int need = target - nums[i];
            if(hash.find(need) != hash.end()) // hash.end()是"不存在标记"
            {
                return {hash[need], i};
            }

            hash[nums[i]] = i; // 值与下标绑定
        }
        return {};
    }
};

3.判断是否互为字符重排

https://leetcode.cn/problems/check-permutation-lcci/description/

算法原理

利用哈希表,但不使用hash<char, int>,因为每次查找都需要遍历一遍原字符串,我们使用数组模拟哈希表,使用两个哈希表,然后判断其出现的次数即可。

优化:只使用一个哈希表

使用一个哈希表进行计数,再判断时遇到相同的字符,其数值-1。

边界情况:若两字符串长度不同,直接返回false。

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if(s1.size() != s2.size()) return false;

        int hash[26] = { 0 };
        for(auto s : s1)
        {
            hash[s - 'a']++;
        }

        for(auto s : s2)
        {
            hash[s - 'a']--;
            if(hash[s - 'a'] < 0) return false;
        }
        return true;
    }
};

本章完。

相关推荐
~|Bernard|26 分钟前
二.go语言中map的底层原理(2026-5-8)
算法·golang·哈希算法
AbandonForce34 分钟前
哈希表(HashTable,散列表)个人理解
开发语言·数据结构·c++·散列表
mask哥39 分钟前
力扣算法java实现汇总整理(下)
java·算法·leetcode
代码中介商40 分钟前
栈结构完全指南:顺序栈实现精讲
c语言·开发语言·数据结构
样例过了就是过了1 小时前
LeetCode热题100 编辑距离
数据结构·c++·算法·leetcode·动态规划
z200509301 小时前
C++中位图和布隆过滤器的一些面试题
开发语言·c++
wearegogog1231 小时前
MATLAB椭圆参数检测算法实现
数据库·算法·matlab
secondyoung1 小时前
Markdown数学公式语法速查手册
算法·编辑器·markdown·latex
君义_noip1 小时前
CSP-S 2025 提高级 第一轮(初赛) 阅读程序(1)
算法·深度优先·信息学奥赛·初赛
小O的算法实验室1 小时前
2026年IEEE TEVC,知识引导的竞争进化算法用于多解传感器-武器-目标分配问题,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进