数组中的第K个最大元素(TopK问题)
题目描述
在未排序的数组中找到第 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(NlogN)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(Nlogk)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问题)相关推荐
- 在数组中查找第k个最大元素_查找数组中每个元素的最近最大邻居
在数组中查找第k个最大元素 Problem statement: 问题陈述: Given an array of elements, find the nearest (on the right) g ...
- 215.数组中的第K个最大元素/347. 前 K 个高频元素
2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...
- 数组中的第K个最大元素
数组中的第K个最大元素 在未排序的数组中找到第k个最大的元素.请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素. 示例 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...
- 【LeetCode】【HOT】215. 数组中的第K个最大元素(优先队列)
[LeetCode][HOT]215. 数组中的第K个最大元素 文章目录 [LeetCode][HOT]215. 数组中的第K个最大元素 package hot;import java.util.Co ...
- 215. 数组中的第 K个最大元素
215. 数组中的第 K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数 组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5 ...
- LeetCode——215,数组中的第K个最大元素(分治法)
尹成老师带你学算法 /*** \* Created: liuhuichao* \* Date: 2020/1/27* \* Time: 11:32 上午* \* Description: 数组中的第K ...
- 力扣(LeetCode)215. 数组中的第K个最大元素(C语言)
一.环境说明 本文是 LeetCode 215题 : 数组中的第K个最大元素,使用c语言实现. 快速选择.查找无序数组的利器! 测试环境:Visual Studio 2019. 二.代码展示 void ...
- ⭐算法入门⭐《哈希表》中等05 —— LeetCode 215. 数组中的第K个最大元素
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 给定整数数组nums和 ...
- LC215. 数组中的第K个最大元素
题目介绍 数组中的第K个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素. 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 输入: [ ...
- leetcode-215 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
最新文章
- Shell脚本中的交互式命令处理
- eclipse中java获取js的值_javascript – 如何在Eclipse中使用Selenium将外部.js导入我的Java测试?...
- 《系统集成项目管理工程师》必背100个知识点-10项目可行性研究阶段
- php浏览器类型检测工具,php检测客户端浏览器类型的简单示例
- jquery input事件
- Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2
- CIF、QCIF、HD1、D1格式介绍
- 学计算机专业能上国家电网吗,高考结束后,选择什么专业能进入国家电网?这些专业考生应该知道...
- linux+模块与设备关系,linux内核设计与实现读书笔记——设备和模块
- 百度Android在线语音识别SDK用法
- php实现求对称二叉树(先写思路,谋而后动)
- Linux课堂练习2
- Camera_Hal3_User_Manual
- ps4html5播放器,PS4终获得全新媒体播放器 允许从PC或U盘串流媒体
- java模拟器安卓7,指小游Java模拟器
- vos3000外呼系统讯时O口网关加密注册 VOS 配置方法
- mysql中查询没有选修某两门课的_50条SQL查询技巧、查询语句示例
- iOS越狱并安装ssl kill switch解除ssl pining,抓取https包
- newifi无盘服务器,newifi 3 padavan纯净版固件,2.4G挺稳定,2019年5.09更新
- 面向企业级的开源WebGIS解决方案--MapGuide(安装)