数组找第k大的数,
BM47寻找最大的K
描述有一个整数数组。请根据快速排序的思想,找出数组中k个最大的数。
给定一个整数数组A,给定它的大小N和你要找的K,请返回K个最大的数(包括重复元素,不需要重复)保证答案存在。要求:时间复杂度,空间复杂度数据范围:数组中每个元素满足
示例1输入:
[1,3,5,2,2],5,3复制返回值:
2份副本
2示例输入:
[10,10,9,9,8,7,5,6,4,3,4,2],12,3复制返回值:
9复印说明:
去重后的第三大数是8,但此题要求包含重复元素,所以不需要去重,所以输出9题的解。
方法一:快速排列这个问题其实和求K的最小数是一样的,只是返回的形式有点不同。代码非常简单,但是在Niuke.com上运行会超时。用Niuke.com提供的同一个官方答案已经不多了,蛋疼~ ~
代码如下:
#包含位/标准数据。h
int sort_once(std:vector int v,int left,int right)
{
if (left==right)
{
向左返回;
}
int key=v[left];
同时(左/右)
{
while (v[right]=左右键
{
右-;
}
if (left==right)
{
打破;
}
v[左]=v[右];
while (v[left]=左右键
{
左;
}
if (left==right)
{
打破;
}
v[右]=v[左];
}
v[left]=键;
向左返回;
}
int findKth(std:vector int input,int n,int k)
{
int left=0;
int right=n-1;
int target _ index=n-k;
while(左=右)
{
int pos=sort_once(输入,左,右);
if (pos==target_index)
{
右=pos
打破;
}
else if (pos target_index)
{
右=pos-1;
}
其他
{
左=位置1;
}
}
返回输入[右];
}方法二:借助堆的实现思想:
如果数组的前k个最大元素形成一个小的根堆,那么堆的顶部元素就是整个数组的k个最大元素。我们可以遍历整个数组,然后维护一个长度为k的小根堆,将整个数组的k个最大元素全部保存到这个小根堆中。放数据的时候,我们每次只需要比较top元素和current元素的值。如果它小于顶部元素,我们将传递它;如果它大于或等于顶层元素,我们就把它放入堆中;如果长度超过k,我们需要先弹出顶部的元素。
代码省略~ ~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。