在未排序的数组中找到第 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 ≤ 数组的长度。

code1:堆排序

class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if(nums.empty()||k<=0||nums.size()<k)
return ; make_heap(nums.begin(),nums.end());
while(k!=)
{
pop_heap(nums.begin(),nums.end());
nums.pop_back();
--k;
}
return nums[];
}
};

code2: bfprt

class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if(nums.empty()||k<||k>nums.size())
return ; vector<int> tmp(nums.begin(),nums.end());
return bfprt(tmp,,tmp.size()-,tmp.size()-k);
}
private:
int bfprt(vector<int>& arr,int left,int right,int k)
{
if(left==right)
return arr[left]; //1.得到中位数
int pivot=getMedian(arr,left,right);
//2.根据中位数划分左右区间
vector<int> pivotRange=_partition(arr,left,right,pivot);
//3.找到中位数排序后的位置,判断k是不是中位数所在的下标范围内,如果在就找到了
if(k>=pivotRange[]&&k<=pivotRange[])
return arr[k];
else if(k<pivotRange[])
return bfprt(arr,left,pivotRange[]-,k);
else /*if(k>pivotRange[1])*/
return bfprt(arr,pivotRange[]+,right,k);
}
int getMedian(vector<int>& arr,int left,int right)
{
int nums=right-left+;
int offset=nums%==?:;//每五个为一组,求每组的中位数,放在中位数数组中
vector<int> midArr(nums/+offset);//中位数数组
for(int i=;i<midArr.size();++i)
{
int l=left+i*;
int r=l+;
midArr[i]=getMedianCore(arr,l,min(r,right));
}
//找中位数组的中位数
return bfprt(midArr,,midArr.size()-,midArr.size()/);
}
int getMedianCore(vector<int>& arr, int left, int right)
{
//中位数组排序,返回中间数
sort(arr.begin()+left,arr.begin()+right+);
return arr[(left+right)/+(left+right)%];//奇数和偶数情况
}
vector<int> _partition(vector<int>& arr,int left,int right,int pivot)
{
int small=left-;
int big=right+;
int cur=left;
while(cur<big)
{
if(arr[cur]<pivot)
swap(arr[++small],arr[cur++]);
else if(arr[cur]>pivot)
swap(arr[cur],arr[--big]);
else
++cur;
}
vector<int> tmp{small+,big-};
return tmp;
}
};

数组中的第K个最大元素的更多相关文章

  1. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

  2. LeetCode:数组中的第K个最大元素【215】

    LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...

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

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

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

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

  5. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

  6. Leetcode 215.数组中的第k个最大元素

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

  7. Leetcode题目215.数组中的第K个最大元素(中等)

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

  8. Java实现 LeetCode 215. 数组中的第K个最大元素

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

  9. 215. 数组中的第K个最大元素 + 快速排序 + 大根堆

    215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...

  10. 数组中的第K个最大元素leetcode(Top K的问题)

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

随机推荐

  1. GO基础之延时执行

    一.延迟是什么?•即延迟( defer)语句,延迟语句被用于执行一个函数调用,在这个函数之前,延迟语句返回. 一.延迟函数 1.可以在函数中添加多个defer语句.•当函数执行到最后时,这些defer ...

  2. linux下的服务器上传与下载

    上传 scp 文件 用户名@服务器ip 服务器保存路径 例如:scp bookmarks_2019_6_24.html root@192.168.0.103:/home 下载 scp 用户名@服务器i ...

  3. 超宽banner图在版心居中

    步骤如下: 1.版心盒子设置相对定位relative 2.banner图设置绝对定位,设置block,清除默认的间距 3.banner图的left设置:left:50%:  margin-left:- ...

  4. CentOS 安装nginx服务

    安装nginx服务 sudo yum install nginx 启动nginx systemctl start nginx 加入启动项 systemctl enable nginx 测试nginx服 ...

  5. 从0使用Ruby on Rails打造企业级RESTful API项目实战之我的云音乐

    本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTful API项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图. 课程简 ...

  6. Oracle - crfclust.bdb文件太大

    今天在检查oracle rac集群时,突然才发现服务器的根目录下面占用了很多空间,照道理不应该出现这种情况,初步猜想可能是哪个日志或跟踪文件太大导致.切换到跟目录,使用du -sh *来一层一层查看到 ...

  7. SQL语句性能调整原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  8. curl 带 body

    curl -H "Content-Type:plain/text" -X POST -d '<?xml version="1.0" encoding=&q ...

  9. 12. Go 语言文件处理

    Go 语言文件处理 本章我们将带领大家深入了解一下 Go语言中的文件处理,重点在于文件而非目录或者通用的文件系统,特别是如何读写标准格式(如 XML 和 JSON 格式)的文件以及自定义的纯文本和二进 ...

  10. SQL查询语法30例

    学好SQL查询:无他,概手熟耳. 1. 基础表: 学生表: 老师表: 课程表: 成绩表: 2. 题目: 1.查询名字中含有"华"字的学生信息 select * from 学生 wh ...