当前位置:   article > 正文

算法训练营第十三天|LeetCode239、LeetCode347_priorityqueue pq = new priorityqueue<>((pai

priorityqueue pq = new priorityqueue<>((pair1, pair2)->pair2[1]-pair1

题目链接:239. 滑动窗口最大值 - 力扣(LeetCode)

个人思路:对于这道题来说,使用单调队列,我先创捷一个结果数组,用来存放输出的元素,再自定义一个队列,用来模拟滑动窗口,我每加进来一个元素,就去和队列的前一个元素进行判断,如果比前一个元素大,则弹出前一个元素

至于加入元素的时候为什么要先判断队列是否为空这个问题,则是因为下面还要移除元素,为空的话removeLast就报错,因为要先移除比val小的

代码如下:

  1. class Solution {
  2. public int[] maxSlidingWindow(int[] nums, int k) {
  3. if(nums.length == 1){
  4. return nums;
  5. }
  6. int len = nums.length-k+1;
  7. int[] res = new int[len];
  8. int num = 0;
  9. MyQueue myQueue = new MyQueue();
  10. for(int i = 0;i<k;i++){
  11. myQueue.add(nums[i]);
  12. }
  13. res[num++] = myQueue.peek();
  14. for(int i= k;i<nums.length;i++){
  15. myQueue.poll(nums[i-k]);
  16. myQueue.add(nums[i]);
  17. res[num++] = myQueue.peek();
  18. }
  19. return res;
  20. }
  21. }
  22. class MyQueue{
  23. Deque<Integer> deque = new LinkedList<>();
  24. void poll (int val){
  25. if(!deque.isEmpty()&&deque.peek()==val){
  26. deque.poll();
  27. }
  28. }
  29. void add(int val){
  30. while(!deque.isEmpty()&&val>deque.getLast()){
  31. deque.removeLast();
  32. }
  33. deque.add(val);
  34. }
  35. int peek(){
  36. return deque.peek();
  37. }
  38. }

题目链接:347. 前 K 个高频元素 - 力扣(LeetCode)

个人理解:本题使用二叉堆来进行求解,但是二叉堆这里并没有了解,因此本题暂且跳过

代码如下:

  1. class Solution {
  2. //解法1:基于大顶堆实现
  3. public int[] topKFrequent1(int[] nums, int k) {
  4. Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数
  5. for(int num:nums){
  6. map.put(num,map.getOrDefault(num,0)+1);
  7. }
  8. //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数
  9. //出现次数按从队头到队尾的顺序是从大到小排,出现次数最多的在队头(相当于大顶堆)
  10. PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);
  11. for(Map.Entry<Integer,Integer> entry:map.entrySet()){//大顶堆需要对所有元素进行排序
  12. pq.add(new int[]{entry.getKey(),entry.getValue()});
  13. }
  14. int[] ans = new int[k];
  15. for(int i=0;i<k;i++){//依次从队头弹出k个,就是出现频率前k高的元素
  16. ans[i] = pq.poll()[0];
  17. }
  18. return ans;
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/277030
推荐阅读
相关标签
  

闽ICP备14008679号