代码随想录算法训练营第六天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

刷题建议

刷题建议与debug

  1. 代码随想录目前基本都有了视频讲解,一定要先看视频,事半功倍。
  2. 写博客,将自己的感悟沉淀下来,不然会忘
  3. 大家提问的时候,记得要把问题描述清楚,自己在哪一步遇到了问题,做了哪些调试,而不要只是把代码甩出来,这样方便大家帮忙快速定位问题。

博客内容:(博客记录以及打卡格式)

今日学习文章链接和视频链接

Python菜鸟教程

哈希表理论基础

大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。

  1. hash表(散列表)一般哈希表都是用来快速判断一个元素是否出现集合里
  2. hash函数:通过hashCode把名字转化为数值
  3. hash碰撞:小李和小王都映射到了索引下标 1 的位置,这一现象叫做哈希碰撞,解决方法有线性探测法和拉链法
  4. hash结构:比如字典,集合等()了解原理
  5. 用法:空间换时间,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
    在这里插入图片描述

242.有效的字母异位词

自己看到题目的第一想法

  1. 暴力破解

看完代码随想录之后的想法

  1. 数组是简单的hash表,这题a-z只有26个字母,可以设置个数组a[0_25]分别的value分别表示a-z出现的次数
  2. 最后遍历数组,如果有a[i]的value不为0,则表示不是字母异位词

自己实现过程中遇到哪些困难

  1. record = [0]*26,忘了列表怎么初始
  2. record[ord(i) - ord(“a”)] += 1 的作用是将字符 i 出现的次数加一,通过将字符映射到 record 列表中的相应位置来实现。这种技巧通常在处理字符串中的字符统计问题时很有用。

相关题目

349. 两个数组的交集

自己看到题目的第一想法

  1. 用数组来hash,遍历nums1,if a[nums1[i]] == 0:a[nums1[i]] += 1
  2. 遍历nums2,if a[nums2[i]] != 0 b[count ++] = [nums2[i]

看完代码随想录之后的想法

  1. 整体思路没错,但是代码处理出现问题
  2. hash结构选择set或者数组,像这种只要一个的用set比较好
  3. 使用数组来做哈希的题目,是因为题目都限制了数值的大小。
  4. 通过这道题,熟悉数组 + 集合

202. 快乐数

自己看到题目的第一想法

  1. 没思路,不知道求和过程咋写

看完代码随想录之后的想法

  1. 明确怎么求和,单独写个函数
  2. 如果sum重复出现,就代表陷入死循环
  3. 怎么判断sum是否重复出现过?==》用set
  4. 题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

1. 两数之和

自己看到题目的第一想法

  1. 判断对应的target是否在数组里==》hash法
  2. 不清楚用哪个数据结构

看完代码随想录之后的想法

  1. 本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
  2. 接下来需要明确两点:map用来做什么?map中key和value分别表示什么?
  3. 这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。
  4. 那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。
  5. 遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。

自己实现过程中遇到哪些困难

  1. 对于数组,set,map这三种数据结构不熟悉,不清楚该用哪个
  2. 具体的思路没有分析出来

今日收获,记录一下自己的学习时长

你可能感兴趣的:(算法,散列表,哈希算法)