哈希表
将关键值key通过某种方式(哈希函数)映射为在哈希表上的位置。
242.有效的字母异位词
for(int i=0;i<s.size();i++){//遍历s字符串
hash[s[i]-'a']++;
}
s[i]-‘a’, 就是一种哈希函数,通过ASCII码的相减确定想要的位置
349. 两个数组的交集
set的知识
set是集合
定义:set<储存的类型> 容器名
unordered_set <int> result_set;
unordered_set<int> nums_set(nums1.begin(),nums1.end());//接受元素的范围
nums_set.insert(int);//插入元素
本题用set可以去除重复的元素。
代码展示
for (int num:nums2){
if(nums_set.find(num)!=nums_set.end()){
result_set.insert(num);
}
}
return vector<int> (result_set.begin(),result_set.end());
注释
上面是for的另一种写法
for(int i=0;i<nums2.size();i++){//传统写法
num =nums2[i];
......
for (int num:nums2)//另一种写法
num表示循环中每次迭代的元素,nums2是要遍历的集合
if(nums_set.find(num)!=nums_set.end()){//判断num是否在nums_set中
result_set.insert(num);
}
//如果 num 存在于 nums_set 中,find 将返回一个指向该元素的迭代器。如果 num 不存在,则 find 返回 nums_set.end()
快乐数
思路
如果sum出现重复,则说明陷入循环,不可能有快乐数出现
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
set<int> result;
int sum=0;
while(sum!=1){
sum=0;
while(n!=0){//第一次错写成n%10!=0了
sum+=(n%10)*(n%10);
n=n/10;
}
n=sum;
if(result.find(sum)!=result.end()){
return false;
}
else{
result.insert(sum);
}
}
return true;
1.两数之和
思路
暴力解
map
当下标指到某个数时,判断target-次数是否在前面被遍历过
eg:target=9,指向的value为2,则判断前面是否遍历过7,如有则返回其下标。
这符合快速判断某元素是否存在在集合中的标准,只不过要查找一个值,返回另一个,面对这样的情况要用map
关于map知识的学习
map <key, value> mp;
// 键 值
mp.find(int) 会返回相应int(key)对应的迭代器(指向键值对),可以通过迭代器获取值。
if(map.find(target-nums[i])!=map.end()){
return {map.find(target-nums[i])->second,i};
//通过返回的迭代器获取对应下标(value)
}
else{
map.insert(pair<int,int>(nums[i],i));
//插入一个键值对
}