在未排序的数组中找到第 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大或者第k小的问题,一般直接想到的就是排序后,按下标取值。但是,直接用冒泡排序肯定是不行的,显得太没有技术含量,那就用他的改进版--快排,这是常考的面试题一定得会。试了全部排序后按下标取值可以AC,但是我们还是可以设置相应的条件进行剪枝,细节见代码。
class Solution {
public:
void quick_sort(vector<int> &nums, int left, int right, int k)
{
int start = left;
int end = right;
int base = nums[left];
int tmp_index = left;
while (right > left)
{
while (right > left && nums[right] >= base)
{
right--;
}
nums[left] = nums[right];
tmp_index = right;
while (right > left && nums[left] <= base)
{
left++;
}
nums[right] = nums[left];
tmp_index = left;
nums[tmp_index] = base;
}
//全部排序
// if (end - tmp_index > 1)
// {
// quick_sort(nums,tmp_index + 1, end, k, result);
// }
// if (tmp_index - start > 1)
// {
// quick_sort(nums, start, tmp_index - 1, k, result);
// }
//有条件的进行排序
if (tmp_index == nums.size() - k)
{
return;
}
else if (tmp_index <= nums.size() - k)
{
if (end - tmp_index > 1)
{
quick_sort(nums,tmp_index + 1, end, k);
}
}
else
{
if (tmp_index - start > 1)
{
quick_sort(nums, start, tmp_index - 1, k);
}
}
}
int findKthLargest(vector<int>& nums, int k) {
quick_sort(nums, 0, nums.size() - 1, k);
return nums[nums.size() - k];
}
};