栈与队列 part03

概念:优先级队列 priority_queue底层实现就是堆的数据结构,大顶堆max-heap,小顶堆,完全二叉树complete binary tree

map数据结构

1、滑动窗口最大值。要求是在线性时间复杂度内解决问题。不考虑时间和空间复杂度的话,暴力解决方法就是2个for循环,一个划定窗口,另一个比较窗口内的最大值,思路这样,自己手写未必也能直接写出来。

队列一进一出的操作很符合窗口的滑动,然后每滑动一次就计算一下窗口最大的元素。que.pop,que.push操作,然后que.front()返回窗口的最大值。c++中multistate可以用来模拟这个过程。每滑动一次,弹出元素的时候,需要判断弹出的元素是否是最大的,所以窗口里的元素要保证是排序的,并且最大元素放在队列出队口。每进一个元素前,就判断下当前元素是否大于等于窗口队列末尾的元素que.back,大于等于的话,就que.pop_back();直到队列末尾元素大于当前元素,进而维护队列元素的降序排列。优化点是,没有必要维护队列窗口里的所有元素,只需要维护有可能成为窗口里的最大元素就可以了。

2、前k个高频元素。用小顶堆,每次小顶堆将最小的元素弹出。参考代码里的一些函数和操作还没有理清。思路是用堆去遍历一遍map里面的所有元素,然后堆里面只维护k个元素。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值