算法通关村14关 | 堆在数组中找第k大的元素应用

1. 在数组中找第k大元素

题目

LeetCode215:给定整数数组nums和整数k,请返回数组中第k个最大的元素,

思路

解题思路用三个,选择法,堆查找和快速排序。

我们选择用大堆小堆解决问题,"找最大用小堆,找最小用大堆,找中间用两个堆",我们构造一个大小只有4的小根堆,为了更好的说明情况,我们扩展一下题目序列[3,2,3,1,2,4,5,1,5,6,2,3]。

堆满了之后,只有大于根节点的元素才能入堆,否则就直接抛弃,元素进入堆中,需要调换位置,满足最小堆的结构,如果发现两个子树都小,则应该和最小的元素交换,如果都一样,则随便选一个。

需要注意:堆不满则直接添加;堆满的时候读到大于根节点的元素才将堆顶拿出,放入新读到的数。

代码

我们用的是Javajdk中的PriorityQueue构建最小堆

java 复制代码
    /**
     * 用最小堆在数组中找第k大的元素
     * @param nums
     * @param k
     * @return
     */
    public int findkLargest(int[] nums, int k){
        if (k > nums.length){
            return -1;
        }
        int len = nums.length;
        //创建一个含有k个元素的最小堆
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(k,(a,b) -> (a - b));
        for (int i = 0; i < k; i++) {
            minHeap.add(nums[i]);
        }
        for (int i = 0; i < len; i++) {
            Integer topEle = minHeap.peek();
            //只要比堆顶大的元素,最顶弹出,遍历的元素进去
            if (nums[i] > topEle){
                minHeap.poll();
                minHeap.offer(nums[i]);
            }
        }
        return minHeap.peek();
    }
相关推荐
风暴之零4 分钟前
变点检测算法PELT
算法
深鱼~4 分钟前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann
李斯啦果5 分钟前
【PTA】L1-019 谁先倒
数据结构·算法
梵刹古音10 分钟前
【C语言】 指针基础与定义
c语言·开发语言·算法
啊阿狸不会拉杆27 分钟前
《机器学习导论》第 5 章-多元方法
人工智能·python·算法·机器学习·numpy·matplotlib·多元方法
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
_OP_CHEN1 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
TracyCoder1232 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九2 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈2 小时前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法