Day8 代码随想录 刷题记录

总结:

共刷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))代表有重复的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值