代码随想录训练营day6|哈希表:242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

哈希表

将关键值key通过某种方式(哈希函数)映射为在哈希表上的位置。

242.有效的字母异位词

242.有效的字母异位词

for(int i=0;i<s.size();i++){//遍历s字符串
            hash[s[i]-'a']++;
        }

s[i]-‘a’, 就是一种哈希函数,通过ASCII码的相减确定想要的位置

349. 两个数组的交集

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()

快乐数

202.快乐数

思路

如果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));
            //插入一个键值对
        }
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值