高效算法中的优先队列甄选

文章标题:

优先队列在算法问题中的巧妙应用

目录

  • 一、1046.最后的石头重量计算
  • 二、703. 数据流里的第 K 大元素
  • 三、692. 前 K 个高频词语
  • 四、295. 数据流的中位数求解

一、1046.最后的石头重量计算

题目链接:1046.最后的石头重量
题目描述:
![

](https://i-blog.csdnimg.cn/direct/16f199517b0d47498355823b0f1d8334.png)

题目解析:

  • 该问题要求我们从给定的数组中不断取出最大的两个元素,让它们相减后将差值重新放入数组,重复此过程直到数组为空或只剩一个元素。

解题思路:

  • 直接对数组排序会频繁操作,效率不高。此时可使用优先队列(大根堆),能快速取出最大元素,降低操作开销。

解题代码:

//时间复杂度 O(n)
//空间复杂度 O(n)
class Solution {
    public int lastStoneWeight(int[] stones) {
        //创建大根堆
        PriorityQueue<Integer> queue = new PriorityQueue<>(
            (a,b) -> b - a
        );
        //将数组元素加入堆中
        for(int i = 0; i < stones.length; i++)
            queue.offer(stones[i]);
        //循环处理,直到堆中只剩一个或没有元素
        while(!queue.isEmpty() && queue.size() != 1) {
            int y = queue.poll();
            int x = queue.poll();
            queue.offer(y-x); 
        }
        //返回结果,如果堆为空返回0,否则返回剩余元素
        return queue.isEmpty() ? 0 : queue.poll();
    }
}

二、703. 数据流里的第 K 大元素

题目链接:703. 数据流中的第 K 大元素

题目描述:
![

](https://i-blog.csdnimg.cn/direct/7b82ee541d5a4890b4ebe3b6e3473fea.png)

题目解析:

  • 给定一个数组和整数K,需通过类的add方法,每次添加元素后返回当前数组中第K大的元素。

解题思路:

  • 利用大小为K的小根堆,堆中始终保存当前数组中第K大到最大的元素,堆顶即为第K大元素。

解题代码:

//时间复杂度 O(nLogK)
//空间复杂度 O(K)
class KthLargest {
    PriorityQueue<Integer> heap;
    int kValue;

    public KthLargest(int k, int[] nums) {
        heap = new PriorityQueue<Integer>();
        kValue = k;
        for(int i = 0; i < nums.length; i++) {
            heap.offer(nums[i]);
            if(heap.size() > kValue) {
                heap.poll();
            }
        }

    }

    public int add(int val) {
        heap.offer(val);
        if(heap.size() > kValue) {
            heap.poll();
        }
        return heap.peek();
    }
}

三、692. 前 K 个高频词语

题目链接:692. 前 K 个⾼频单词

题目描述:
![

](https://i-blog.csdnimg.cn/direct/9867706b13004912a11605b9a5555c3b.png)

题目解析:

  • 给定字符串数组words,需找出出现频率最高的前K个字符串,频率相同时按字典序从小到大排列。

解题思路:

  • 先用哈希表统计字符串出现次数,再用大小为K的堆,结合自定义比较器处理频率和字典序,最后逆序结果得到正确顺序。

解题代码:

//时间复杂度:O(NLogK)
//空间复杂度:O(N)
class Solution {
    public List<String> topKFrequent(String[] words, int k) {
        Map<String, Integer> countMap = new HashMap<>();

        PriorityQueue<Pair<String,Integer>> heap = new PriorityQueue<>(
            (a,b) -> {
            //频率相同时按字典序降序,保证弹出时为升序
            if(a.getValue().equals(b.getValue())) {
                return b.getKey().compareTo(a.getKey());
            }
            //频率不同时按升序
            return a.getValue() - b.getValue();
        });
        //统计单词出现次数
        for( String s : words) {
            countMap.put(s, countMap.getOrDefault(s ,0) + 1);
        }
        //将元素放入堆,保持堆大小不超k
        for(Map.Entry<String, Integer> entry : countMap.entrySet()) {
            heap.offer(new Pair<>(entry.getKey(),entry.getValue()));
            if(heap.size() > k) {
                heap.poll();
            }
        }
        //收集结果并逆序
        List<String> result = new ArrayList<String>();
        while(!heap.isEmpty()) {
            result.add(heap.poll().getKey());
        }
        Collections.reverse(result);
        return result;
    } 
}

四、295. 数据流的中位数求解

题目链接:295. 数据流的中位数

题目描述:

  • 需实现一个类,能初始化、添加元素,并在添加后快速获取数据流的中位数。

题目解析:

  • 通过维护大根堆和小根堆,根据元素个数调整堆的分布,从而快速得到中位数。

解题思路:

  • 维护大根堆(存前半部分元素)和小根堆(存后半部分元素),根据插入元素的大小和堆的情况调整元素分布,保证元素个数为偶数时两堆平衡,奇数时一堆多一个元素。

解题代码:

//时间复杂度:O(LogN)
//空间复杂度:O(N)
class MedianFinder {
    //记录元素个数
    int elementCount = 0;
    //大根堆存储前半部分元素
    PriorityQueue<Integer> maxHeap;
    //小根堆存储后半部分元素
    PriorityQueue<Integer> minHeap;


    public MedianFinder() {
        maxHeap = new PriorityQueue<>((a,b) ->{
            return b - a;
        });
        minHeap = new PriorityQueue<>();
    }

    public void addNum(int num) {
        elementCount++;
        if(elementCount == 1 ) {
            maxHeap.offer(num);
            return;
        }
        //元素个数为偶数且当前数大于大根堆堆顶
        if(elementCount % 2 == 0 && maxHeap.peek() <= num) {
            if(maxHeap.size() < minHeap.size()) {
                if(!minHeap.isEmpty() && minHeap.peek() >= num) {
                    maxHeap.offer(num);
                }else {
                    int temp = minHeap.poll();
                    maxHeap.offer(temp);
                    minHeap.offer(num);
                }
            }else {
                minHeap.offer(num);
            }
            return;
        } 
         //元素个数为偶数且当前数小于大根堆堆顶
        if(elementCount % 2 == 0 && maxHeap.peek() > num) {
            if(maxHeap.size() < minHeap.size()) {
                maxHeap.offer(num);
            }else {
                int temp = maxHeap.poll();
                maxHeap.offer(num);
                minHeap.offer(temp);

            }
            return;
        } 
         //元素个数为奇数且当前数小于大根堆堆顶
         if(elementCount % 2 != 0 && maxHeap.peek() >= num) {
            maxHeap.offer(num);
         } else {
            minHeap.offer(num);
         }
    }

    public double findMedian() {
        if(elementCount % 2 == 0) {
                return (double)((maxHeap.peek() + minHeap.peek())/ 2.0);
        }
        if(maxHeap.size() > minHeap.size()) {
             return maxHeap.peek();
        } else {
            return minHeap.peek();
        }

    }
}

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12847.html

(0)
LomuLomu
上一篇 2025 年 7 月 9 日
下一篇 2025 年 7 月 10 日

相关推荐

  • IntelliJ IDEA 2025.3 破解教程实测可用

    申明:本教程 IntelliJ IDEA 破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! IDEA是 JetBrains 推出的开发编辑器,功能强大,适用于 Windows、Mac 和 Linux 系统。本文将详细介绍如何通过破解补丁实现永久激活,解锁所有高级功能。 不管你是什么版本、什么…

    IDEA破解教程 2026 年 1 月 1 日
    1.7K00
  • 最新datagrip破解视频讲解+永久激活码配置

    申明:本教程 DataGrip破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! DataGrip是 JetBrains 推出的开发编辑器,功能强大,适用于 Windows、Mac 和 Linux 系统。本文将详细介绍如何通过破解补丁实现永久激活,解锁所有高级功能。 如果觉得破解麻烦,可以购买…

    DataGrip激活码 2025 年 12 月 24 日
    18500
  • PyCharm激活码怎么填?填错后怎么补救?

    声明:以下教程中涉及的 PyCharm 破解补丁与激活码均源自网络公开渠道,仅供个人学习研究,严禁商用。若条件允许,请支持正版!如涉侵权,请联系删除。 先放一张实测截图,PyCharm 2025.2.1 已成功续命到 2099 年,爽歪歪! 接下来用图文一步步演示如何搞定最新版 PyCharm 的激活。 嫌折腾?官方正版全家桶低至 32 元/年,点这里直接上…

    PyCharm激活码 2025 年 9 月 8 日
    25800
  • 实用图文教学:clion激活码申请与最新clion破解教程

    免责声明:以下激活补丁与注册码均源自网络,仅供个人学习参考,禁止商业用途。若条件允许,请支持正版 JetBrains! 废话少说,先放一张 Clion 2025.2.1 成功激活到 2099 年的截图,爽就完事! 下面用图文一步步演示如何给最新版 Clion 打上补丁并激活。 前期准备 如果你之前尝试过其他破解方式失败,建议先卸载干净再重装;或者把旧配置清掉…

    2025 年 11 月 11 日
    16500
  • 最新IDEA激活码获取方法及破解说明

    免责声明:下文所涉 IDEA 2025.2.1 破解补丁及激活码均源自互联网公开分享,仅供个人学习研究,禁止商业用途。若条件允许,请支持正版:https://panghu.hicxy.com/shop/?id=18(低至 32 元/年,全家桶直接登录即用)。 话不多说,先上图:IDEA 2025.2.1 已顺利激活至 2099 年,稳! 下面用图文方式带你一…

    IDEA破解教程 2025 年 11 月 21 日
    31100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信