找到第K大的数
思路
在这里我主要用了快速排序的思想,但是效率高的前提是尽量确保原数组的无序和随机性。否则快速排序的复杂度会提高到O(n^2)
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
Set the startIndex = 0 and the endIndex = nums.size()-1;
因为我们假设了快速排序是ascending order,所以 k = nums.size()-k; (reverse the k;倒数第K个元素)
我们设置pivot value 为nums[startIndex] 并且初始化两个游标cursors:left = startIndex+1 & right = endIndex 。通过快速排序的方法,顺利找到 pivot value 应该在的索引位置,最后开始判断,如果此时的索引位置等于k,那么可以直接返回k索引的元素值;如果大于或小于k值那么开始进行下一轮的递归。
实现
class solution{
public:
int findKthLargest(vector<int>& nums int k)
{
int start = 0, end = nums.size()-1, k = nums.size()-k;
return _findKthLargest(nums,k,start,end);
}
private:
int _findKthLargest(vector<int>& nums,int k, int start,int end)
{
//检验start 和 end 的合法性
if (start <= end)
{
int pivotVal = nums[start];
int left = start+1;
int right = end;
//快速排序
while (true)
{
while(left <= end && nums[left]< pivot) left ++;
while(right >= start+1 && nums[right]> pivot) right--;
if (left > right) break;
swap(nums[left++],nums[right--]);
}
swap(nums[start],nums[right]);
//如果 right = k 那个直接返回元素
if(right == k) return nums[k];
else if(right > k)
{
return _findLthLargest(nums,k,start, right-1);
}
else
{
return _findKthLargest(nums,k,right+1,end);
}
}
return -1;
}
};