题目
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
解法:快排
快排相关细节见:快速排序
找到第K大的值,再快排的时候,交换后first或者last会记录每个key的值,倒数第K大的值下标就是nums.size()-K,只需要比较目标值和key的下标,比key大就往左递归,比key小就往右递归
把任意一种快速排序变形一下即可,去掉快排里的递归,将递归写到循环中去
int findKthLargest(vector<int>& nums, int k) {
int l=0,r=nums.size()-1,target=nums.size()-k;
while(l<r){
//两个及以上元素
int mid=quick_sort(nums, l, r);
if(target<mid) r=mid-1;
else if(target>mid) l=mid+1;
else return nums[mid];
}
return nums[l];
}
int quick_sort(vector<int> &nums,int l,int r){
//只要找出最大选择点,因此不需要顾及相遇之后浪费的步数,优先找到last的下界
int first=l,last=r,key=nums[l];
while (first < last)
{
while (first < last && nums[last] >= key)
{
--last;
}
nums[first] = nums[last]; //比key小的数填入空位first,last空出
while (first < last && nums[first] <= key)
{
++first;
}
nums[last] = nums[first]; //比key大的数填入last,first空出,如果first last都没进循环,也只是一次简单的交换
}
nums[first] = key; //最后key填入空位
return first; //记录选择点的位置,之前的数都比他小
}