给出一个整数数组,找出数组中第K大的数。
测试样例:
[45,67,33,21]
2
返回:45
滴滴的笔试题,不知道有什么非法的字符集,在vs里编译不通过,但是牛客网上编译是通过了的。
思路:快排
代码:
#include <iostream>
#include <vector>
using namespace std;
int quickfind(vector<int>& a, int left, int right, int k) {
int i = left;
int j = right;
int mark = a[left];
//快排的方法实现哨兵mark左边都是小于它的,右边都是大于它的
while (i < j) {
while (i < j && a[j] >= mark)
--j;
if (i < j)
a[i++] = a[j];
while (i < j && a[i] <= mark)
++i;
if (i < j)
a[j--] = a[i];
}
a[i] = mark;
//哨兵右侧比他大的数字个数
int big_num = right - i;
//如果哨兵刚好是第K大的数
if (k - big_num - 1 == 0)
return mark;
else if (k - big_num - 1 > 0) {
//如果右侧数字个数不够K个,则从左侧找第k-big_num-1大的数
return quickfind(a, left, i - 1, k - big_num - 1);
} else {
//如果右侧数字个数比K多,则在右侧找第K大的数
return quickfind(a, i + 1, right, k);
}
}
int findKth(vector<int> a, int n, int K) {
return quickfind(a, 0, n-1, K);
}
int main(){
int temp;
vector<int> num;
int k;
while(cin.peek()!='\n'){
cin >> temp;
num.push_back(temp);
}
cin>>k;
int n = num.size();
cout<<findKth(num,n,k)<<endl;
return 0;
}