题目描述

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

示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路一(全局排序)

很直接,对原数组排序,然后返回第 k 个最大的元素(nums[n-k])即可。
时间复杂度为 O(Nlog⁡N)O(N \log N)O(NlogN)

思路二(局部排序)

用冒泡排序,选出k个最大的数,返回nums[k-1]即可。
时间复杂度为 O(Nk)O(Nk)O(Nk)

代码(c++)

class Solution {public:int findKthLargest(vector<int>& nums, int k) {if(nums.size()==0) return 0;for(int i=0;i<k;i++){for(int j=nums.size()-1;j>i;j--){if(nums[j]>nums[j-1]) swap(nums[j],nums[j-1]);}}return nums[k-1];}
};

思路三(堆)

维护一个存放k个元素的小顶推,遍历数组,依次与堆顶元素比较,如果当前元素比堆顶元素大,则堆顶元素出堆,该元素入堆;否则继续遍历数组。这样,当遍历完所有元素后,堆中存放的便是数组中最大的k个数,堆顶便是第k大的数。
时间复杂度为 O(Nlog⁡k)O(N \log k)O(Nlogk)

代码(c++)

class Solution {public:int findKthLargest(vector<int>& nums, int k) {if(nums.size()==0) return 0;priority_queue<int,vector<int>,greater<int> > q;for(int i=0;i<k;i++) q.push(nums[i]);for(int i=k;i<nums.size();i++){if(q.top()<nums[i]){q.pop();q.push(nums[i]);}}return q.top();}
};

思路四(减治法)

快速排序每一次都会确定一个数在排序后的位置。这里我们可以利用快速排序这一特点,当找到第n-k个数,停止排序,返回该元素即可。
这里之所以是减治,是因为我们不需要真的像快速排序那样,分别处理由排好序的那个数分开的两个子数组。我们只需判断排好序的那个数的位置与n-k的大小关系,确定所要找的数所在的子数组,处理这个子数组便可。
时间复杂度 平均情况 O(N)O(N)O(N),最坏情况 O(N2)O(N^2)O(N2)。

代码(c++)

class Solution {public:int quickSort(vector<int>& nums,int l,int r,int k){int index=(int)round(1.0*rand()/RAND_MAX*(r-l)+l);swap(nums[index],nums[l]);int temp=nums[l];int left=l;int right=r;while(left<right){while(left<right&&nums[right]>=temp) right-=1;nums[left]=nums[right];while(left<right&&nums[left]<temp) left+=1;nums[right]=nums[left];}nums[left]=temp;if(left==k) return nums[left];else if(left<k) return quickSort(nums,left+1,r,k);else return quickSort(nums,l,right-1,k);}int findKthLargest(vector<int>& nums, int k) {if(nums.size()==0) return 0;srand((unsigned)time(NULL));int tempK=nums.size()-k;return quickSort(nums,0,nums.size()-1,tempK);}
};

数组中的第K个最大元素(TopK问题)相关推荐

  1. 在数组中查找第k个最大元素_查找数组中每个元素的最近最大邻居

    在数组中查找第k个最大元素 Problem statement: 问题陈述: Given an array of elements, find the nearest (on the right) g ...

  2. 215.数组中的第K个最大元素/347. 前 K 个高频元素

    2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...

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

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

  4. 【LeetCode】【HOT】215. 数组中的第K个最大元素(优先队列)

    [LeetCode][HOT]215. 数组中的第K个最大元素 文章目录 [LeetCode][HOT]215. 数组中的第K个最大元素 package hot;import java.util.Co ...

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

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

  6. LeetCode——215,数组中的第K个最大元素(分治法)

    尹成老师带你学算法 /*** \* Created: liuhuichao* \* Date: 2020/1/27* \* Time: 11:32 上午* \* Description: 数组中的第K ...

  7. 力扣(LeetCode)215. 数组中的第K个最大元素(C语言)

    一.环境说明 本文是 LeetCode 215题 : 数组中的第K个最大元素,使用c语言实现. 快速选择.查找无序数组的利器! 测试环境:Visual Studio 2019. 二.代码展示 void ...

  8. ⭐算法入门⭐《哈希表》中等05 —— LeetCode 215. 数组中的第K个最大元素

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给定整数数组nums和 ...

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

    题目介绍 数组中的第K个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素. 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 输入: [ ...

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

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

最新文章

  1. Shell脚本中的交互式命令处理
  2. eclipse中java获取js的值_javascript – 如何在Eclipse中使用Selenium将外部.js导入我的Java测试?...
  3. 《系统集成项目管理工程师》必背100个知识点-10项目可行性研究阶段
  4. php浏览器类型检测工具,php检测客户端浏览器类型的简单示例
  5. jquery input事件
  6. Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2
  7. CIF、QCIF、HD1、D1格式介绍
  8. 学计算机专业能上国家电网吗,高考结束后,选择什么专业能进入国家电网?这些专业考生应该知道...
  9. linux+模块与设备关系,linux内核设计与实现读书笔记——设备和模块
  10. 百度Android在线语音识别SDK用法
  11. php实现求对称二叉树(先写思路,谋而后动)
  12. Linux课堂练习2
  13. Camera_Hal3_User_Manual
  14. ps4html5播放器,PS4终获得全新媒体播放器 允许从PC或U盘串流媒体
  15. java模拟器安卓7,指小游Java模拟器
  16. vos3000外呼系统讯时O口网关加密注册 VOS 配置方法
  17. mysql中查询没有选修某两门课的_50条SQL查询技巧、查询语句示例
  18. iOS越狱并安装ssl kill switch解除ssl pining,抓取https包
  19. newifi无盘服务器,newifi 3 padavan纯净版固件,2.4G挺稳定,2019年5.09更新
  20. 面向企业级的开源WebGIS解决方案--MapGuide(安装)

热门文章

  1. ResourceQuota 和 LimitRange 实践
  2. 干货|热门工资条生成软件测评 避免踩雷!
  3. spring boot项目多个配置文件的profiles.active读取优先级
  4. A表取数据处理后插入B表,Mysql大数据插入,优化过程
  5. 用python进行按掩膜提取的批量操作
  6. 学习如何基于鳄鱼(Alligator)设计交易系统
  7. 简单两步找回忘记的WiFi密码
  8. 两相步进电机和五相步进电机
  9. Windbg符号无法加载的问题
  10. linux more 下一页_Linux more命令详解