No.136
复盘:
1、这道题核心思路就是遍历数组,记录数字出现的次数并找出只出现了1次的数字
2、这种题我的第一想法就是用哈希集来存储数字,由于其他数字都出现了两次,因此我的做法是如果出现1次则把数字存入哈希集,
再出现的话就删去这样的话到最后哈希集中剩下来的就是只出现了一次的数字。
3、但是这道题比较特殊,只有一个数字出现一次,其他数字都出现了两次。一个数字与它本身的异或为0,与0的异或为它本身,
再加上异或运算的交换律,我们可以得出只要将所有数字逐个异或,最后剩下来的就是只出现了一次的数字
4、异或运算的方法同样适用于约去偶数次找奇数次,但是如果其他数字都不是偶数次,那这种方法就用不了
No.169
复盘:
1、这个题的核心思路也是记录数字出现的次数,找出出现最多的数字
2、我是直接用哈希表存次数,当找到出现次数大于n/2的数字的时候则直接返回
3、题解中排序的做法挺简洁的,由于众数出现次数大于n/2,所以排序完的中位数一定是众数
4、题解中分治的做法也值得学习,把数组分为两半,至少有一部分的众数是整个数组的众数,如果两个部分众数相同,则就是这个众数。
如果不相同,则再根据两个部分众数的次数的大小进行比较,再加上单个数字的众数就是它本身,因此这样分治完最终得到的就是整个数组的众数。
No.15
复盘:
1、这道题还是有点难度的,核心思路是找出不重复且和为零的三元组
2、首先是先排序再进行查找,这样能减少很多含重复数字的组。
3、然后通过观察三重循环可以看出来由于和为0,第二重循环从小到大的话第三重循环一定是比原来要小的元素,因此我们可以把第三重循环第三重循环改成变成一个从数组最右端开始向左移动的指针
此时便在原来三重循环的基础上将时间复杂度减到最小了,因此最后的解决方法就是排序加双指针循环。
No.75
复盘:
1、这道题的核心思路就是通过原地交换元素来完成让所有相同数字相邻的结果
2、首先可以很容易想到的是,我们可以直接统计每个数字出现的次数,然后直接把对应数量的数字放到一起就行了。当然这样就不是原地排序了,并且会占用额外的空间。
3、提到原地排序的话首先应该会想到双指针吧,这道题双指针有两种,一种记录0和1,同时从前往后。这种解法需要注意的就是可能会把原来换的1给换到后面去,
所以需要多一步来将0指针换的数字给换到1指针的位置。而另一种记录0和2的就不用了,一个从前往后一个从后往前。
No.56
复盘:
1、这道题的话核心思路就是通过对左端点的值进行排序,然后再根据相邻区间的端点值合并区间。
2、首先需要根据各区间左端点的值进行排序,因为每一个区间的左端点决定了是否会有重合区间,排序完之后,如果有重合的区间那么他们一定是相邻的。
3、后面就简单了,先把第一个区间扔进结果里,再逐个检查后面的区间有没有重合,检查重合就看后面区间的左端点和结果区间的右端点的大小比较就行了。
No.706
复盘:
1、这道题还挺简单的,主要就是考察对哈希表的理解
2、对于题目要求的三个函数,只需要根据键值对进行存储和删除就行了,还有需要注意的就是哈希表随机地址的定义。