代码随想录算法训练营day13|239.滑动窗口最大值

239.滑动窗口最大值

  1. 自己的思路:描述简单。使用一个快慢指针,fast先向前行动k值,之后slow再移动,每次俩者都同时向后移动一格,使用一个内部函数找出最大值。时间复杂度应该是O(kn),使用额外的vector存储结果O(n)
  2. 或者使用类似单调栈,,但是怎么出和入

看题解,学会了构建单调队列
3. 对头永远是最大值,之后的元素单调递减
4. 所以当元素从窗口出去时,如果和队头元素相同那么需要移除队头元素
5. 当元素进入窗口时,和队列尾元素比较,如果不符合递减,那么就需要一直移除队尾元素直到,队尾元素比当前元素大,即符合递减

347.前K个高频元素

  1. 自己的思路,使用一个容器存储数值和出现的次数,然后排序,再按顺序输出前k个高频元素。:这里的容器可以使用unordered_map,但是排序需要构建一个vector<pair>然后,使用sort(),并且提供一个自定义的比较数值的比较函数进行排序,之后再按顺序输出。时间复杂度应该是O(n+nlogn)=》 O(nlogn)

  2. 看题解使用优先级队列。这里的思路是这样的,先使用map存储一个元素和对应次数的数组,然后如果直接对整个数组进行排序,那么时间复杂度是不合格的,但是如果只维护一个前K大元素的堆,那么会是时间减少

https://leetcode.cn/problems/top-k-frequent-elements/solutions/402568/qian-k-ge-gao-pin-yuan-su-by-leetcode-solution

实现过程中出现俩个错误,一个是priority_queue构建的第三个参数是一个函数对象,使用lambda时不需要取地址. 这里还是有些不明白,需要更多关于函数对象的知识
第二个错误是 vector<int> result(k); for (int i = k - 1; i >= 0; i--) { result[i] = pri_que.top().first; pri_que.pop(); }
这里我忽略了先初始化vector然后使用operator[]访问.使得访问到了非法地址,因为operator[]是不进行范围检查的

栈与队列总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值