算法通关村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();
    }
相关推荐
(❁´◡`❁)Jimmy(❁´◡`❁)3 分钟前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年18 分钟前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
lally.32 分钟前
整数等差数列超图中的三个非微扰现象
算法
wabs66640 分钟前
关于字符串【力扣541.反转字符串II的思考】
数据结构·算法·leetcode·字符串
土司大王44 分钟前
LeetCode hot100——移动零
java·算法·leetcode
Tyler_TXZ2 小时前
C++C语言之——树
c语言·c++·算法·
旖旎夜光2 小时前
LeetCode 30:串联所有单词的子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
白狐_7982 小时前
408 数据结构|完全二叉树两道典型题:第 6 层叶结点数与叶结点总数
数据结构·算法
lucas_AI2 小时前
喂张白纸也能吐出证件号?文档 MLLM 的"关系级泄露"被测出来了
人工智能·算法·掘金技术征文
手写码匠2 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 灰度发布实战:让每一次变更都“小步快跑、随时可回滚“
人工智能·深度学习·算法·aigc