分治法
题目链接:点击打开链接
一开始我感觉就是个排序的题目,于是便用了类似快排的方法来做,因为经过与同学的讨论后,知道了快排本来就是每一遍都求第k个最大的数,题目便可解了。
听了课之后,发现这就是老师所说的selection问题
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int left = 0,right = nums.size() - 1;
while(left < right)//其实类似于快排,
{
int myleft = left,myright = right;
int find = nums[myleft];//定为中间枢纽,用find来保留值
while(myleft < myright)//要做到myleft与myright相等
{
while(myleft < myright && nums[myright] < find)//注意审题,一开始我还弄反了
--myright;
nums[myleft] = nums[myright];
while(myleft < myright && nums[myleft] >= find)
++myleft;
nums[myright] = nums[myleft];
}
nums[myleft] = find;
if(k-1 == myleft)//因为快排的每一遍其实就是在找第k个大的元素
return nums[myleft];
else if(k-1 > myleft)//所求在当前枢纽的右边
left = myleft + 1;
else//在左边
right = myleft - 1;
}
return nums[k-1];//就是在那个位置
}
};