代码随想录算法训练营第十三天|239、347

239:

代码随想录

第一道hard题,花了很久。

从题解里了解到用单调队列来做,但一开始我用了queue而不是deque,然后也没有完全理解一个关键点:

添加新元素时要从尾到头比较,并且从尾移除所有比新元素小的元素,这样才能保证除了队列头以外的部分也都是从大到小。

举例说明:[1,3,1,2,0,5],k=3。当初始窗口开始滑动的时候队列为 3,1 并且需要加入2,我一开始是用queue,只能与头(也就是3)作比较,2<3,于是2就在1没有被移除的情况下加入了,使得队列变成 3,1,2 ,这就导致当窗口再次移动至[1,2,0],队列里移除3之后,队列(1,2)的头变成了1,这时再用peek取最大值的话就会获得错误的答案。
所以加入2的正确方法是从尾开始先跟1比较,2>1,移除1,再跟3比较,2<3,加入2,这样就能保证队列中正确的排序。

还有一个重点则是结果数组的大小,我一开始是先用ArrayList储存结果,最后再遍历放入一个同大小的数组。但其实只要new一个大小为 nums.length - k + 1 的数组就可以了。这道题每个窗口都有一个最大值,所以只要算出窗口的数量就可以了。这里的1代表初始窗口,nums.length - k 代表的是滑动后得到的所有数组。

347:

代码随想录

看题解之前想到了用map来记录每个数字的出现频率。看过题解之后用priority queue实现代码的时候遇到了些困难。

因为对pq的操作不太熟,所以花了点时间看怎么定义pq的comparator,然后还学习了用Entry来遍历map的方法。

操作了解了之后跟着思路实现代码还是比较容易的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值