前言

堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆
最大堆即 堆顶元素为堆中最大的元素
最小堆即 堆顶元素为堆中最小堆元素

如下为一个最大堆


回到文章标题,获取一个数组中第K大的数,要求时间复杂度是O(n),即一次遍历即可获取到该值。
所以普通的先排序,再获取第k个数值的方式显然不满足要求,排序最快的快速排序也需要O(log2 n)

这里就是我们前言中提到的堆 数据结构堆优势了,可以构建一个最小堆,堆顶始终为堆中所有元素的最小值。当然在本次实现中,仅需要将堆堆大小限制为要求的K个即可,此时遍历完数组的元素,堆顶即为数组中第K大的值。

基本过程如下图:

实现如下(文末有测试代码):

int calculte_k_maxnum(vector<int> &arr, int k) {priority_queue <int,vector<int>, greater<int>> small_heap;//有衔接队列构建最小堆if (arr.empty()) {print_erro("the array is empty\n",__LINE__);}/*按照步骤入堆*/for(int i =0;i < arr.size(); ++i) {if (small_heap.size() < k) {small_heap.push(arr[i]);} else if (small_heap.size() == k && small_heap.top() < arr[i]) {small_heap.pop();small_heap.push(arr[i]);}}/*最终的堆顶元素即为第K大的元素*/return small_heap.top();
}

测试代码如下:

#include <iostream>
#include <queue>
#include <vector>using namespace std;void print_erro(string s,int line) {cout << s <<" " << line << endl;exit(-1);
}int calculte_k_maxnum(vector<int> &arr, int k) {priority_queue <int,vector<int>, greater<int>> small_heap;if (arr.empty()) {print_erro("the array is empty\n",__LINE__);}for(int i =0;i < arr.size(); ++i) {if (small_heap.size() < k) {small_heap.push(arr[i]);} else if (small_heap.size() == k && small_heap.top() < arr[i]) {small_heap.pop();small_heap.push(arr[i]);}}return small_heap.top();
}int main(){vector<int> arr;int k;int tmp;cout << "input the number of arr you want to get max " << endl;cin >> k;cout << "input the arr number " << endl;for (int i = 0;i < 5; ++i) {cin >> tmp;arr.push_back(tmp);}cout << "the k's max number of arr is " << calculte_k_maxnum(arr,k) << endl;return 0;
}

输出如下:

input the number of arr you want to get max
4
input the arr number
2 4 3 6 7
the k's max number of arr is 3input the number of arr you want to get max
1
input the arr number
1 4 7 9 6
the k's max number of arr is 9

C++的STL 堆 实现获取数组堆第K大的数相关推荐

  1. Leetcode215数组中第k大的数-最小堆

    题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...

  2. 寻找数组中第k大的数

    题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2 ...

  3. 求无序数组的第K(大/小)数的三种方法

    题目描述:给定一个无序数组(长度为n)和一个正整数 K,让你求此数组中第K大的数 方法1:最简单的思路,你肯定会想到 先把数组排序,然后再取下标为K的对应数组元素.这种方法肯定是可行的,但是这种方法无 ...

  4. java查找第k大的数字_查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  5. 寻找无序数组中第k大的数

    对于一个无序的数组,怎样找到其中第k大的数呢?下面总结几种方法. 1.直接排序法 使用常见的归并排序.堆排序等算法对数组进行排序,然后找到第k大的数.排序算法的时间复杂度为O(nlogn),所以算法总 ...

  6. 找出数组中第k大的数

    给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...

  7. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

  8. python实现查找数组中第k大的数

    本文用python3实现查找数组中第k大的数.采用快速排序的方法实现. def findKth(s, k):return findKth_c(s, 0, len(s) - 1, k)def findK ...

  9. 【leetcode】找出数组的第k大的数

    用快排,原始的快排 def quick_sort(nums,l,r):if l<=r:returntmp = nums[0]while l<r: while l<r and nums ...

最新文章

  1. 这两者需要映射到相同的服务器,从而无法打开项目的解决方法:
  2. 说一说网站与搜索引擎之间不得不知的联系
  3. 给新手的 11 个 Docker 免费上手项目
  4. php 数据接口,初识 php 接口
  5. 把github转至gitee
  6. Python 之 sorted()排序详解 适用于任意可迭代对象比如列表,字典等
  7. 中国水下照明行业市场供需与战略研究报告
  8. Android:访问网络资源,在手机本地显示网络资源源代码
  9. 计算机主机电源功率查,电脑电源功率怎么测试?查看电脑功耗的操作方法
  10. R 分析裂区试验设计
  11. 关于一些Excel的快捷键总结
  12. 计算机土木工程专业,土木工程专业需要什么样的电脑配置?
  13. 真实测评vivoY30和红米k30哪个好-vivoY30和红米k30区别
  14. 消息中间件 - ActiveMQ高级特性和用法-Mirrored Queue 镜像队列(了解即可)(十)
  15. 训练指南 UVALive - 4043(二分图匹配 + KM算法)
  16. IT30: IT项目之20年软技能
  17. 查找:顺序查找、二分查找、分块查找
  18. 2018python教程百度云盘_『求老2018男孩Python最新全栈开发全套视频教程』python开发 百度云教程...
  19. 《计算机组成原理》第二版第四章课后习题解答
  20. 3D设计必备!5个免高质量的 HDRI 环境贴图网站

热门文章

  1. VS中C#读取app.config数据库配置字符串的三种方法(转)
  2. [置顶] 面向业务开发应用
  3. 强烈推荐:240多个jQuery插件
  4. 谈 三层结构与MVC模式的区别
  5. Visual C#弹出窗口杀手
  6. 计算机组成原理读写周期波形图,第3章存储器层次结构-1讲述.ppt
  7. 我所理解的卡尔曼滤波——公式推导与应用
  8. 人脸服务器如何与门禁系统对接,人脸识别门禁系统终端设备接口说明
  9. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
  10. Java数组传参sql_Java中如何传一个数组作为筛选条件操作数据库(sql中foreach的使用)...