寻找第K大(NC88/考察次数Top7/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找第K大(NC88/考察次数Top7/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
示例1
输入:
[1,3,5,2,2],5,3
返回值:
2
(题目来自牛客网)
用C++实现如下
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
// write code here
//思路1,进行库函数sort排序后进行求解
vector<int> tmp = a;
sort(tmp.begin(), tmp.end()); //使用库函数sort排序
int res = tmp[n-1];
for(int i = n-1; i>0; --i) //遍历找值,找到第K大值
{
if(tmp[i]>tmp[i-1])
{
if(K == 1)
{
return tmp[i];
}
K--;
}
}
return res;
// //思路2,使用快速排序二分查找来处理,利用快速排序的特点(找出某值的合适
//位置,左边所有的值比他都小,右边的值比他都大)
// quicksort(a, 0, n-1, K); //自定义quicksort函数
// int res = a[n-1];
// for(int i = n-1; i>0; --i)
// {
// if(a[i]>a[i-1])
// {
// if(K == 1)
// {
// return a[i];
// }
// K--;
// }
// }
// return res;
// //定义quicksort函数(此处为前面排序算法中有讲解的快速排序法)
// void quicksort(vector<int>&a, int left, int right, int K){
// if(left>=right)
// return;
// int i = left;
// int j = right;
// int val = a[i];
// while(i<j)
// {
// while(i<j && a[j]>=val)
// j--;
// a[i] = a[j];
// while(i<j && a[i]>=val)
// i++;
// a[j] = a[i];
// }
// a[i] = val;
// quicksort(a, left, i-1, K);
// quicksort(a, i+1, right, K);
// }
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于寻找第K大(NC88/考察次数Top7/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章
链表中的节点每K个一组翻转(NC50/考察次数Top12/难度中等)