算法通关村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();
    }
相关推荐
wuweijianlove17 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong17 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志17 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光17 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_1117 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia18 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg18 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒18 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾18 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
SatVision炼金士18 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法