LeetCode347. 前 K 个高频元素
方法一:桶排序
class
方法二:优先队列问题
这里需要注意的是,优先队列的排序函数是如何对比的,以及需要维护的是大顶堆还是小顶堆,这里要的是topk的,因为维护的是大顶堆,这样就可以定义compare函数,定义的时候看要重写operator,前面要加上struct。
之后遍历优先队列,就可以得到返回的前k个频率的元素值
这里还需要注意的是,优先队列里面放的是一个pair,然后map的值可以直接作为pair放在队列中。
class
方法三:优化版本的优先队列问题
看了解析中,前面是维护的大顶堆,完了之后遍历队列,得到返回值。这里直接维护小顶堆,小顶堆的大小是map大小减去k,当小顶堆大于这个数的时候,就是需要返回的元素,因此可以直接用vector加入返回列表中,就不需要再次遍历队列了。
class
LeetCode 451. 根据字符出现频率排序
这个题也是一个桶排序的题,我出错的点在于,这个题要求在出现频率相同的情况下,一样的字母是挨在一起的,所以遍历的顺序就很重要了。一开始我是按照原字符串的顺序遍历的,这样当字符出现频率相同的时候,添加的顺序就按照原来字符串中出现的顺序的,这样是不符合题目要求的,因此还是不要重复在basket中重复添加字符,还是只添加一次,但是它出现的频率就是一个下标的问题,因此可以循环下标次数,然后多次添加。
注意的点是,桶排序,最后遍历的肯定是桶的大小,从后往前遍历的,而且桶的第一个元素一般是没有东西的。
class
LeetCode75. 颜色分类
方法一:
颜色分类问题,这个根据提示,先用map存储一下各个数字出现的次数,之后根据频率重新对数组元素分布即可。
class
方法二:单次循环,// 利用双指针,设置一个为0和1的分界指针,一个1和2的分界指针。一开始0和1的分界线是-1,// 也就是0在刚开始区域是0,一开始1和2的分界线是nums.size,也就是2的区域大小是0,然后设置指针在滑动,如果是0就扩大0的区域,如果是2就扩大2的区域。
但为啥等于0的时候就index++,但是在指向2的时候就不index不用++了,感觉是left++,所以index也要加加?【疑问ing】
class