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
复制说明:
去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
题解
这个题实际上和寻找最小的k个数一样,只不过返回的形式有点差异。代码很简单,但是在牛客网上运行超时,同样的使用牛客网的官方提供的答案也是运行超时,蛋疼~~
代码如下:
int sort_once(std::vector<int> &v, int left, int right)
{
if (left == right)
{
return left;
}
int key = v[left];
while (left < right)
{
while (v[right] >= key && right > left)
{
right--;
}
if (left == right)
{
break;
}
v[left] = v[right];
while (v[left] <= key && left < right)
{
left++;
}
if (left == right)
{
break;
}
v[right] = v[left];
}
v[left] = key;
return left;
}
int findKth(std::vector<int> input, int n, int k)
{
int left = 0;
int right = n - 1;
int target_index = n - k;
while (left <= right)
{
int pos = sort_once(input, left, right);
if (pos == target_index)
{
right = pos;
break;
}
else if (pos > target_index)
{
right = pos - 1;
}
else
{
left = pos + 1;
}
}
return input[right];
}