仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
当我们需要查询一个元素是否出现过或者一个元素是否在集合里的时候就需要用到想到哈希法
202. 快乐数
快乐数:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。可以变为 1,这个数就是快乐数。
提供参数:整数n
主要操作:
定义一个集合set用来存储中间计算结果sum(sum为各位置平方和)
重复以下操作:
拆分数字计算sum
判断sum,若为1,return true;若不为1,判断sum是否存在于set中若否,则加入set;若是,则return false(当sum存在于set中时说明sum重复,当sum重复则进入无限循环)
是否存在无限不循环的情况?
在本题判断中,若结果为true,则为快乐数,中间sum值可以变为1;若结果为false,则不为快乐数,出现sum循环;若存在无限不循环的情况,则应该一直在循环中。是否会一直在循环中?结果是不会。
当n的位数达到int能取的最大位数时,就算每个位置都取最大的9,新计算出来的sum也只是1053,是四位数,而四位数计算出来的sum不超过324,这也可以说明,如果最多循环了325(1+324)次仍没有脱离循环,则一定出现了sum重复的情况
1. 两数之和
提供参数:数组nums,目标数target
主要操作:
创建一个map,用于存储遍历过但不符合要求的数据
(其中数值作为key,索引作为value,即map存储的是:(nums[i],i)键值对)
遍历数字组,若遇到满足条件的返回两数索引,否则将该数加入map
若遍历完整个数组仍未找到满足条件的数据,则返回空集合
与242.有效的字母异位词,349.两个数组的交集一样的思路,只不过将数据结构换为了map,因为在这道题中使用数组则容易造成较大的内存空间浪费,同时既需要存储值又需要存储索引
这题将对能够相加和等于target的两数的寻找转化为遍历数组,每当遍历到一个元素sums[i]时,在map中寻找是否存在满足target-sums[i]的一个数,而这正好是使用哈希表的关键
map存储nums[i],i)键值对的原因:需要先找到相加等于target的数,再去寻找两数的索引