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;
    }
};

本章完。

相关推荐
Aaron15882 小时前
RFSOC+VU13P+RK3588的核心优势与应用场景分析
嵌入式硬件·算法·matlab·fpga开发·信息与通信·信号处理·基带工程
优家数科2 小时前
精准预测:基于多维用水量的滤芯寿命预警算法
算法
脱氧核糖核酸__2 小时前
LeetCode热题100——189.轮转数组(题解+答案+要点)
数据结构·c++·算法·leetcode
贾斯汀玛尔斯2 小时前
每天学一个算法-快速排序(Quick Sort)
数据结构·算法
炽烈小老头2 小时前
【每天学习一点算法 2026/04/16】逆波兰表达式求值
学习·算法
优家数科3 小时前
水质监测不准?解密云端 TDS 数据建模纠偏算法
算法
木井巳3 小时前
【递归算法】组合总和
java·算法·leetcode·决策树·深度优先·剪枝
coding者在努力3 小时前
被n整除的n位数
c++·算法
赵药师3 小时前
Win11下的VS2022 配置RGBD435i 相机
c++·vs2022·windows11·rgbd435i