Leetcode242. 有效的字母异位词
题目链接:
[242. 有效的字母异位词 - 力扣(Leetcode)]
思路:
- 利用数组作为哈希表储存每个单词字母出现的次数
- 依次遍历两个字符串,对哈希表做++/–
- 最后若哈希表有不为0的数,说明字母出现次数不相等,false
class Solution {
public:
bool isAnagram(string s, string t) {
int count[26]={0};
for(int i=0;i<s.size();i++)
{
count[s[i]-'a']++;
}
for(int i=0;i<t.size();i++)
{
count[t[i]-'a']--;
}
for(int i=0;i<26;i++)
{
if(count[i]!=0)
{
return false;
}
}
return true;
}
};
Leetcode349. 两个数组的交集
题目链接:
思路(参考代码随想录):
-
**使用数组来做哈希的题目,是因为题目都限制了数值的大小。**而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
-
题目要求去重,且不要求排序,使用
unordered_set
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res;
unordered_set<int> nums(nums2.begin(),nums2.end());
for(int num:nums1)
{
if(nums.find(num)!=nums.end())
{
res.insert(num);
}
}
return {res.begin(),res.end()};
}
};
Leetcode202. 快乐数
题目链接:
思路:
- 题意可能出现无限循环-
实际意义为记录出现的sum值,若重复立刻返回false
- 记录可使用哈希
class Solution {
public:
int getSum(int n){
int sum=0;
while(n){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> res;
while(1){
int sum=getSum(n);
if(sum==1)
{
return true;
}
if(res.find(sum)!=res.end())
{
return false;
}else{
res.insert(sum);
}
n=sum;
}
}
};
Leetcode1. 两数之和
题目链接:
思路:
- 常规暴力两层循环
- 采用哈希
- 遍历时每访问一元素,去寻找
target-nums[i]
- 找到返回下标
- 找不到把该元素即下标作为
<key,value>
存入哈希
- 遍历时每访问一元素,去寻找
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> res;
for(int i=0;i<nums.size();i++)
{
auto x=res.find(target-nums[i]);
if(x!=res.end())
{
return {i,x->second};
}
res.insert(pair<int,int>(nums[i],i));
}
return {};
}
};
总结
由于一直搞不清楚哈希迭代器模板使用,今天借此机会细微了解了一下
收获
-
创建空的set:
unordered_set<int> set1;
-
unordered_set
的初始化:unordered_set<int> set3(set1.begin(), set1.end());
(利用迭代器构造) -
成员方法:
begin
返回指向容器中第一个元素的正向迭代器。end
返回指向容器中最后一个元素之后位置的正向迭代器。find(key)
查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器( end() 方法返回的迭代器)。
-
res.find(sum)!=res.end()
代码含义:用find这个函数,去找res这个序列中的i元素,如果序列中所找的这个元素不存在,就会返回end(),即如果res.find(i)返回的不是res.end(),就说明在res序列中找到i元素 -
for循环for(int num : nums)
代码含义:为for
循环,添加一个container
,它就会自动迭代:实现了对于vector
型变量vec
的内容打印,变量i遍历vector
中的每一个元素,直到vector
的结束。 -
auto x=res.find(target-nums[i])
:auto的原理就是根据后面的值,来自己推测前面的类型是什么;- 注意:用auto声明的变量必须初始化
-
x->second
:x存储实际上是一个<x,y>
键值对,x->first
访问xx->second
访问y。 -
[细节知识点指路]