最大/最小de K个数/第K个数

题目

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

思路

堆排序

收获

用优先队列实现最大最小堆
注意下列代码中优先队列的创建声明,需要自定义比较函数

代码

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> h = new PriorityQueue<>((n1,n2)->n1-n2);
        for(int i:nums){
            h.add(i);
            if(h.size()>k){
                h.poll();
            }
        }
        return h.poll();
    }
}

原文地址:https://www.cnblogs.com/Jun10ng/p/12355026.html

时间: 2024-10-11 05:16:35

最大/最小de K个数/第K个数的相关文章

求二叉树第K层的节点个数+求二叉树叶子节点的个数

size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if (root == NULL)            return 0; if (root->_left == NULL&&root->_right == NULL);        return 1; return _FindLeafSize(root->_right) +

POJ 题目3415 Common Substrings(后缀数组+栈,求可以匹配到的长度大于k的公共子串个数)

Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8471   Accepted: 2798 Description A substring of a string T is defined as: T(i, k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|. Given two strings A, B and one integer K, we define S, a

求 区间[a,b]内满足p^k*q*^m(k&gt;m)的数的个数

题目描述: 1<=a,b<=10^18,p,q都是素数  2<=p,q<=10^9; 求在[a,b]内可以表示为  x*p^k*q^m  k > m   的数的个数 分析: 由于要小于b,因此m一定小于 log10(b)/log10(p*q); 因此我们可以枚举m,中间计数的时候需要用到容斥. 具体看代码: #include <iostream> #include <cstdio> #include <cmath> #include <

【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈

这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的,每次与h[i]取min时必定将栈尾一些长的全部取出来,搞成一个短的. 所以就开一个栈,栈里存的是长度,同时存一下它的出现此处cnt. 注意各种细节啊.. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring>

利用最小堆找出10亿个数中最大的10000个数

最小堆 最小堆是一种完全二叉树,特点是根节点比两个子节点都小(或者根节点比子节点都大) 过程 先找10000个数构建最小堆 依次遍历10亿个数,如果比最小堆的最小值大,则替换这个最小值,并重新构建最小堆 最后输入10000个值 时间复杂度 构建最小堆的复杂度为 logn,求出最大m个数会构建m次最小堆,时间复杂度为 m logm, 这里m为10000 进行n次时间复杂度为n,这里n为10亿,总时间复杂度为 n m logm,即10亿 10000 log 10000 其他算法 将十亿个数排序,找出

0~9十个数,每个数只能使用一次,组成两个三位数相加和为四位数的算法

这几天上网,看到百度里面有人问这一道题目,0~9十个数,组成如下加法式 *** + *** = ****,每个数字都只能使用一次,问一共多少中组合? 今天,就用C#语言来写一下,解出这道题,其他语言算法相同,只是语法不同,这里由于时间关系,不再贴出代码. 这里先讲解一下思路,首先我们是程序员,不是数学家,我们是站在编程的角度思考问题.这里是两个三位数相加,得到一个四位数,所有数字不能重复,那么最小的三位数是123,最大的三位数是987,确定循环的范围,当然你非要用100到999也可以,不过就是效

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)

线性筛 线性筛在数论中起着至关重要的作用,可以大大降低求解一些问题的时间复杂度,使用线性筛有个前提(除了素数筛)所求函数必须是数论上定义的积性函数,即对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数,若a,b不互质也满足的话则称作完全积性函数,下面说明每个筛子是怎么筛的. 最基础的是素数筛,其它三个筛都是以素数筛为前提 素数筛 void get_prime() { int pnum = 0; for(int i = 2;

算术基本定理 求一个数的约数个数

算术基本定理  求一个数的约数个数 算术基本定理: 分解素因数:n=(p1^k1)*(p2^k2)*...*(pn*kn).(分解方式唯一) n的约数个数为cnt(n)=(1+k1)*(1+k2)*...*(1+kn). bool isprime[maxn]; vector<int> prime; void play_prime() { memset(isprime,1,sizeof(isprime)); isprime[1]=0; for(int i=2;i<maxn;i++){ if

20亿以内哪个数的约数个数最多,个数是多少?

混蛋的百度吞了我好几条答案. 于是我在这里发下:是1536 这里在贴一下部分评测数据,为什么是部分呢?因为是在很多台电脑上跑的,丢了一些,但是肯定跑全了!答案是没有错的.嗯,有好几个数的约数个数都是1536. 额,我还是先贴一下评测代码吧. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 15 int ans=0; int p[N],cnt;

c语言求字符串中大写字母个数,单词个数,子串个数及一个整数是否为回文数

#include <stdio.h> #include <ctype.h> #pragma mark 统计从终端输入的字符中每个大写字母的个数.用#号作为输入结束标志 int main() { int num[26] = {0}, i; char c; while ((c = getchar())!='#') { if (isupper(c)) { num[c-65]++; } } for (int i = 0; i<26; i++) { if (num[i]) { prin