class Solution
{
public:
int quickselect(vector<int>& nums,int k,int lo,int hi)
{
int n=nums.size();
if(lo>=hi) return 0; //递归基
int temp=nums.at(0); //选取候选节点
int i=lo,j=hi;
while(true)
{
while(nums[i++]<temp) //在左侧选取比temp大的节点
{
if(i==hi) break;
}
while(nums[j--]>temp) //在右侧选取比temp小的节点
{
if(j==lo) break;
}
if(i>=j) break;
swap(nums[i],nums[j]);
}
swap(temp,nums[j]);
if(j==n-k) return nums[j];
else if(j<n-k) return quickselect(nums,k,j+1,hi);
else return quickselect(nums,k,lo,j-1);
}
int findKthLargest(vector<int>& nums, int k)
{
int n=nums.size();
return quickselect(nums,k,0,n-1);
}
};
leetcode 215 使用快速选择找出第n-k小的元素
最新推荐文章于 2024-07-31 13:37:25 发布