一般哈希表都是用来快速判断一个元素是否出现集合里。
242.有效的字母异位词
题目链接:242. 有效的字母异位词 - 力扣(LeetCode)
讲解链接:代码随想录 (programmercarl.com)
将第一个数组中出现过的元素存储到对应的哈希表(数组)中,出现过的字母位置处+1,第二个数组出现过的元素对应位置元素-1,到最后如果数组不为0,则不是有效的字母异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
int hash[26] = { 0 };
for (int i = 0; i < s.size(); i++)
{
hash[s[i] - 'a']++;
}
for (int j = 0; j < t.size(); j++)
{
hash[t[j] - 'a']--;
}
for (int k = 0; k < 26; k++)
{
if (hash[k] != 0)return false;
}
return true;
}
};
349.两个数组的交集
题目链接:349. 两个数组的交集 - 力扣(LeetCode)
讲解链接:代码随想录 (programmercarl.com)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int>result_set;//存储结果值
unordered_set<int>nums_set(nums1.begin(), nums1.end());/*将nums1转换成std::unordered_set,存到nums_set中*/
for (int num : nums2)
{
//搜寻nums2的元素
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
202.快乐数
如果出现重复的数字,则说明陷入循环,不是快乐数。
class Solution {
public:
//每个位置上的数字平方和
int GetSum(int n)
{
int sum = 0;
while (n)
{
sum = sum + (n % 10) * (n % 10);
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int>set;
//判断如果出现重复的数,则陷入循环,则不是快乐数
while (1)
{
int sum = GetSum(n);
if (sum == 1)
{
return true;
}
if (set.find(sum) != set.end())
{
return false;
}
else {
set.insert(sum);
}
n = sum;
}
}
};
1.两数之和
使用哈希表中的map结构,注意key对应元素值,value对应索引
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int, int>map;
for (int i = 0; i < nums.size(); i++)
{
int s = target - nums[i];
auto iter = map.find(s);
if (iter != map.end())
{
return{ i,iter->second };
}
else {
map.insert(pair<int, int>(nums[i], i));//前者存key,后者存value
}
}
return {};
}
};