首页 > 其他分享 >代码随想录day06 |242.有效的字母异位词 ;349. 两个数组的交集;202. 快乐数 ;1. 两数之和

代码随想录day06 |242.有效的字母异位词 ;349. 两个数组的交集;202. 快乐数 ;1. 两数之和

时间:2023-01-17 21:00:48浏览次数:65  
标签:map 202 set int 随想录 vector 哈希 ans 两数

关键内容:哈希表,三种哈希结构

官方说法:哈希表是根据关键码的值而直接进行访问的数据结构。
用途:一般哈希表都是用来快速判断一个元素是否出现集合里。
哈希本质就是牺牲空间换取时间

三种常见哈希结构:

  • 数组
  • set
  • map

代码随想录中关于这三种结构的解读

242,使用了数组作为hash表,注意下标问题。若是大小写,则数组长度更大。

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26]={0};
        for (int i=0;i<s.size();i++)
        {
            record[s[i]-'a']+=1;            //开始record【】内未-‘a’,此处是用了一个相对数值
        }
        for (int i=0;i<t.size();i++)
        {
            record[t[i]-'a']-=1;
        }
        for (int i=0;i<26;i++)
        {
            if(record[i]!=0)
            return false;
        }
        return true;
    }
};

349 set中的unorderd_set的使用。set与map中unordered的那一种通常查询和增删效率更高。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
      //  vector<int> result;
        int hash[1001]={0};         //val在1-1000,数组容量应至少1001除非后面存储val-1
        unordered_set<int> p;
        for (int i : nums1)         //注意,i不是nums1的index,而是值;
        {
            hash[i]=1;
        }
        for (int i : nums2)
        {
            if(hash[i]==1)
            {
                p.insert(i);     //注意插入函数insert
            }
        }
        return vector<int>(p.begin(),p.end());  //vector的构造方式之一
    }
};

202,242的拓展

class Solution {
public:
    bool isHappy(int n) {
        unordered_set<int> result;
        int x=n;
        int ry;
        int ans=0;
        while(1)
        {
            while(x>0)
            {
                ry=x%10;
                x=x/10;
                ans+=ry*ry;
            }
            if(ans==1)
            {
                return true;
            }
            if(result.find(ans)!=result.end())      //此处if内的写法注意,这是用来判断一个元素是否在set内
            {
                return false;
            }
            result.insert(ans);
            x=ans;
            ans=0;
        }
    }
};
  1. l用unordered_map解决,需要注意该结构的一些用法,以及返回的时候的形式。
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++) {
            // 遍历当前元素,并在map中寻找是否有匹配的key
            auto iter = map.find(target - nums[i]);          //此处只有用auto,才能不犯类型不匹配的错误; 
            if(iter != map.end()) {
                return {iter->second, i};        
            }
            // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};

        
    }
};

总结:
当需要快速判断一个元素是否是在表中时,应想到是不是可以用哈希表;
三种哈希结构应熟练掌握;

标签:map,202,set,int,随想录,vector,哈希,ans,两数
From: https://www.cnblogs.com/wryyyyyyy/p/17058682.html

相关文章

  • 2022年终总结----大学生技术自媒体成长之路
    前言:Hello大家好,我是Dream。还有不到两周就要过年了,自己也马上迈入了21岁,感慨时间飞快,从19岁开始做一名博主,到现在也已经整整两年了,超百万字的博客也记录着我两年的成长......
  • 2021 ICPC 沈阳 J Luggage Lock
    链接:vJudge题意:有一个4位数字的密码锁,一次操作你可以选择连续的若干位同时向上或向下旋转一位,现问你从一个状态变换到另一个状态的最少操作次数思路:化繁为简,首先可以......
  • 2023牛客寒假算法基础集训营1题解
    写在前面全文收集了部分学长以及我自己的代码,本蒟蒻第一次写博客,效果不好请见谅TwT原题链接:https://ac.nowcoder.com/acm/contest/46800#questionA:WorldFinal?WorldC......
  • WC 2023
    不搞事后诸葛亮,得一分有据少一分有理。CTT之后几乎没打过什么OI赛制的模拟赛,这导致我很担心打OI赛制的突发情况。开考后20min读了一遍所有题,没有令人感到很能做的......
  • 17th Jan NC61 两数之和
    给出一个整型数组numbers和一个目标值target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。(注:返回的数组下标从1开始算起,保证target一定可以由......
  • 2021-01-17
    写点什么呢!今天上班的第四天,来的时候寻思着日记本带着不方便,就留在书架上了,啊!!我真的烦,刚想着写点什么,我妈又和我姐在群里吵起来了。哈哈哈!!!还得我出面解决纷争。两个人一点都......
  • 「WC2023」等风雪停下,等枯树生花。
    滴答滴答时间落在每个春夏虽不曾说话,我能听到它不再害怕,明天还会有所牵挂不会太复杂,用余生写一个回答之前报名过了,既然都报名了,去WC玩。都放开了,为啥不恢复线下......
  • 我的 2022
    我的2022因为去年给我排版排得太阴间了于是今年选择自己排(富文本好麻烦啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊一年过去,我的文学素养又下降了一大截这咋整成就在即将过......
  • java:日期转型将“2023-03-14 00:00:00“转为年月日
    java:日期转型将"2023-03-1400:00:00"转为年月日old="2023-03-1400:00:00"Datedate=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").parse(old);old=newSimpleDateForm......
  • [ROC-RK3399-PC Pro] 手把手教你移植主线U-Boot(基于v2022.04-rc5版本)
    ......