题目:
- 在数组中找到第 k 大的元素。
- 要求时间复杂度为O(n),空间复杂度为O(1)。
输入:
n = 1, nums = [1,3,4,2]
输出:
4
分析:
最开始想到是利用快排序。快速排序在每一次swap之后都能够找到某一个元素(例如 a a a)正确的位置。则:
- a a a刚好是第K个元素,则输出;
- 若 a a a的位置在第K个位置右侧,则接下来去其左侧快排;
- 若 a a a的位置在第K个位置左侧,则接下来去其右侧快排;
代码:
class Solution {
public:
/**
* @param n: An integer
* @param nums: An array
* @return: the Kth largest element
*/
int kthLargestElement(int n, vector<int> &nums) {
// write your code here
return getRes(nums,n,0,nums.size()-1);
}
int getRes(vector<int> &nums,int k,int left, int right){
int tmp=nums[left],n=nums.size(),tleft=left,tright=right;
while(left<right){
while(right>left&&nums[right]>tmp) right--;
if(right>left){
nums[left++]=nums[right];
}
while(left<right&&nums[left]<=tmp) left++;
if(left<right) nums[right--]=nums[left];
}
nums[left]=tmp;
if(left==