上篇文章:力扣题型--链表(合并K个升序链表|K个一组翻转链表)
目录
1.哈希表简介
1.1哈希表是什么
存储数据的容器
1.2作用
"快速"查找某个元素(O(1)时间复杂度)
1.3什么时候用
频繁的查找某一个数时(也可以想到二分)
1.4怎么用
- 容器(哈希表)
- 用数组模拟简易哈希表:
- 查找字符串中的"字符"
- 数据范围很小时
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;
}
};
本章完。