map 排序_专题系列——排序(二)桶排序

a1ff2d082bdb3e1d87a55be924b5f0a1.png

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值