题目:
在未排序的数组中找到第 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 ≤ 数组的长度。
思路:
首先想到快速排序递归实现,同时由于我们只需要输出第k大的元素,所以在每次将序列分成左右两部分的时候,判断k处于哪个序列中,如果不处于左右序列,则直接退出,如果处于某一序列中,只对该段序列再次使用快排,直至k不在左右序列中。
class Solution {
//修改过的快速排序
void quick_sort(vector<int> &nums, int left, int right,int k){
if(left >= right) //区间内不存在元素,直接返回
return;
int pivot = nums[left]; //获取轴值
int leftIndex = left; //获取左端点索引指示
int rightIndex = right; //获取右端点索引指示
while(leftIndex < rightIndex){
while(leftIndex < rightIndex){
if(pivot >= nums[rightIndex])
--rightIndex;
else{
nums[leftIndex] = nums[rightIndex];
++leftIndex;
break;
}
}
while(leftIndex < rightIndex){
if(pivot <= nums[leftIndex])
++leftIndex;
else{
nums[rightIndex] = nums[leftIndex];
--rightIndex;
break;
}
}
nums[leftIndex] = pivot;
//根据k的范围,选择接下来需要进行的递归操作
if(k-1 < leftIndex)
quick_sort(nums,left,leftIndex-1,k);
if(k-1 > rightIndex)
quick_sort(nums,rightIndex+1,right,k);
}
}
public:
int findKthLargest(vector<int>& nums, int k) {
quick_sort(nums,0,nums.size()-1,k);
return nums[k - 1];
}
};