首页 > 其他分享 >215. 数组中的第K个最大元素

215. 数组中的第K个最大元素

时间:2022-10-25 16:48:23浏览次数:86  
标签:peek 215 堆顶 nums int 元素 queue 数组

215. 数组中的第K个最大元素

优先队列的思路是很朴素的。由于找第 K 大元素,其实就是整个数组排序以后后半部分最小的那个元素。因此,我们可以维护一个有 K 个元素的最小堆:

如果当前堆不满,直接添加;
堆满的时候,如果新读到的数小于等于堆顶,肯定不是我们要找的元素,只有新遍历到的数大于堆顶的时候,才将堆顶拿出,然后放入新读到的数,进而让堆自己去调整内部结构。
说明:这里最合适的操作其实是 replace(),即直接把新读进来的元素放在堆顶,然后执行下沉(siftDown())操作。Java 当中的 PriorityQueue 没有提供这个操作,只好先 poll() 再 offer()。

优先队列的写法就很多了,这里只例举一个有代表性的,其它的写法大同小异,没有本质差别。

public int findKthLargest(int[] nums, int k) {

        //建立小根堆
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, Integer::compare);

        //前K个数堆化
        for(int i = 0; i < k; i++) {
            queue.offer(nums[i]);
        }

        //向堆中插入剩下length - k个元素
        for(int i = k; i < nums.length; i++){
            //获取堆顶最小值
            int peek = queue.peek();
            //如果堆顶最小值大于当前的数,弹出并加入当前的数字, 那么此时的数字就是第length-k个最小的数, 反过来想就是第k个最大的数
            if(peek < nums[i]){
                queue.poll();
                queue.offer(nums[i]);
            }
        }

        //获取堆顶元素第K个最大的数字
        return queue.peek();
    }

作者:liweiwei1419
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array/solution/partitionfen-er-zhi-zhi-you-xian-dui-lie-java-dai-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:peek,215,堆顶,nums,int,元素,queue,数组
From: https://www.cnblogs.com/phonk/p/16825358.html

相关文章

  • mybatis typehandler适配postgresql中的point数组数据类型
    mybatistypehandler适配postgresql中的point数组数据类型importlombok.extern.slf4j.Slf4j;importorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibat......
  • Java数组
    Java数组什么是数组数组是相同类型数据的有序集合。数组声明创建//声明dataType[]arrayName;//首选方法dataTpearrayName[];//创建使用new操作符创建数组dataTy......
  • 编写Golang程序以查找数组中每个元素的出现次数
    http://www.nhooo.com/note/qa5b2a.html解决这个问题的方法  步骤1: 定义一个接受数组的方法。步骤2: 定义一个映射,其中key将是数组的元素,起始值为0。步......
  • PostgreSQL 数组类型使用详解
    PostgreSQL数组类型使用详解PostgreSQL数组类型使用详解可能大家对PostgreSQL这个关系型数据库不太熟悉,因为大部分人最熟悉的,公司用的最多的是MySQL我们先对Postgr......
  • Luogu P2150 [NOI2015]寿司晚宴
    题目链接:​​传送门​​太难了太难了题意就是问有多少种分案把一个到的排列分配为两组并使组间元素两两互质首先我们只需要考虑根号内的质因子对答案的影响,因为根号外的因......
  • shell脚本之数组
    一、数组的概念数组中可以存放多个值。BashShell只支持一维数组(不支持多维数组)。与大部分编程语言类似,数组元素的下标由0开始。Shell数组用括号来表示,元素用"空格......
  • 实验3 数组、指针与现代C++标准库
    实验任务5:info.hpp文件源码 1#pragmaonce2#include<string>3#include<iostream>4#include<iomanip>5usingnamespacestd;6classinfo{7pub......
  • 原生数组转包装类(基本类型数组、包装类数组、集合之间的相互转换(以及遍历方法))
    importjava.util.*;importjava.util.stream.Collectors;importstaticjava.util.Arrays.*;publicclassZhuanHuan{publicstaticvoidmain(String[]args){......
  • Java数组定义和内存原理
    数组定义和访问容器概念容器:是将多个数据存储到一起,每个数据称为该容器的元素。数组概念数组概念:数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。数组......
  • POJ 2184(01背包+滚动数组)
    01背包模板题Programdd;constmaxn=1000;maxv=100000;minv=-100000;NULL=-2139062144;varn,i,j,ans,p,np:longint;ts,tf:array[1..maxn]oflongint;......