0
点赞
收藏
分享

微信扫一扫

[数组]BM47 寻找第K大-中等

​​BM47 寻找第K大​​

描述

有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。

给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。要求:时间复杂度 [数组]BM47 寻找第K大-中等_数组,空间复杂度 [数组]BM47 寻找第K大-中等_快排_02数据范围:[数组]BM47 寻找第K大-中等_快排_03, [数组]BM47 寻找第K大-中等_快排_04,数组中每个元素满足 [数组]BM47 寻找第K大-中等_最大第K个数_05

示例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个数一样,只不过返回的形式有点差异。代码很简单,但是在牛客网上运行超时,同样的使用牛客网的官方提供的答案也是运行超时,蛋疼~~

代码如下:


#include <bits/stdc++.h>

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];
}
举报

相关推荐

0 条评论