总结:
共刷2题,用时2h30mins。总体效率不错,着重学习与使用unorder_set相关的用法,明确其去重的功能。端午安康~
349. 两个数组的交集
自己的想法:
用十个数字来遍历,如果这十个数字在第一个数组中出现过,则标记数字对应的数组的值为1。
再走一轮循环,如果标记的数字的值再次在第二个数组中出现,则将该数组值设定为2,最后输出设定为2的数组值。
想法错误。上述想法仅仅适用于题目中给出的样例,如果原数组的值是{12,99,458}则无法作答。(与字母的表现形式不一样,不能够混为一谈)。
正确的做法:哈希数据结构:unordered_set(包含去重操作)
如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。 (将1~99999的数字均列为哈希表,来记录是否出现过的做法是不恰当的)

哈希表映射的三个关键点:数组、set、map
数组适用于数值不是很多且相对较为连续的情况。
当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。
在本题中,unordered_set可以返回一个去重的列表。是一个数据类型,相当于vector形式。
注意:
1.表示的相关的问题。
// 遍历 nums2 中的每个元素
for (int num : nums2) {
// 检查当前元素 num 是否存在于 nums_set 中
相当于:
for(int i = 0;i < nums2.size();i ++)
另外,函数中的用法还包括.find( )和.end( )
nums_set.find(num) != nums_set.end()
含义:num存在于nums_set中(即在nums1中出现过)
end() 的本质:
指向数组中最后一个元素的位置,与find()函数相呼应,因为find函数如果未能找到对应的值,则会进入end( )。
find( )与end( )搭配使用,表明边界。
2.转化数组时的表示方法:
unordered_set<int> num_set(nums1.begin, nums1.end());
vector<int>(result.begin(), result.end());
以 表示形式(x.begin(), x.end())的形式来返回数组。
3.向数组中增加新元素:
x.insert( )
4.如果要转换成数组来做,要注意的是:将原有的数组的值看作下标,对应的数组下标值取1。
第202题. 快乐数
自己的想法:
直接写循环,但是不知道如何跳出可能出现的无限循环的情况。
正确的做法:识别循环
无限循环的根本原因:sum会重复出现,所以如果能够找到那个重复出现的sum,就可以直接求解了。
思路:看到可能重复出现的函数也要考虑到哈希表。
unordered_set可以用于识别是否有重复的值并返回。核心if(set.find() != set.(end))代表有重复的值。
1700

被折叠的 条评论
为什么被折叠?



