在未排序的数组中找到第 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. Github原生CI/CD,初尝Github Actions

    Github 原生 CI/CD,初尝 Github Actions Intro Github 目前已经推出了自己的 CICD 服务 -- Github Actions,而且比微软的 Azure Dev ...

  2. 爬虫(二):抓包工具Fiddler

    1. 抓包工具Fiddler 1.1 Fiddler下载与安装 最简单的方法,打开百度,搜索fiddler下载. 下载完毕解压即可,此版本为绿色版. 点击这个即可运行抓包软件. 1.2 Fiddler ...

  3. mysql order by limit 的一个坑

    分页查询的时候遇到的坑: 发现的问题: 对单个无索引的字段进行排序后limit .发现当被排序字段有相同值时并且在limit范围内,取的值并不是正常排序后的值, 也就是说,当排在第N行的数据可取key ...

  4. OSG嵌入QT的简明总结

    目录 1.解决方案 2.存在问题 1) 警告提示 2) 多线程问题 3) 其他 1.解决方案 不得不说关于OSG的资料实在太零散了,搜索了很多关于OSG在QT下的解决方案,都是各有各的说法,有的说的不 ...

  5. Dynamics 365利用Web API对视图进行查询

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. TSC打印机防重码在线检测系统

    条码标签作为产品的一个身份标识,被应用得越来越普及,但随着使用量的增大,在打印条码流水号的过程中,偶尔会出现打印重复号码的标签出现,这样对产品生产及管理过程中会产生极大的混乱,会收到严重的客诉及返工, ...

  7. 安装完dlib以及face_recognition,但是在python IDE中无法导入的问题

    在dlib以及face_recognition通过pip安装成功之后(如何通过pip进行安装,在博主的上一篇随笔中有提及),在pycharm中无法导入. 在综合完网上的各种说法之后,发现了原因,在下边 ...

  8. 如何通过 subprocess 持续获取输出内容

    在实际应用中会用到subprocess的Popen方法执行一些命令,而我们需要通过执行这个命令的来获取输出进行一些信息记录或者分析使用,如果是很快就可以执行完的那还好,有时需要持续跟踪内容的输出,比如 ...

  9. ASCII码表收藏

    ASCII码表 ASCII码值 ESC键 VK_ESCAPE (27)回车键: VK_RETURN (13)TAB键: VK_TAB (9)Caps Lock键: VK_CAPITAL (20)Shi ...

  10. sass参考手册

    http://sass.bootcss.com/docs/sass-reference/