leetcode第215题
方法一:选择排序
选择排序,第k轮可以求得第k大的数字
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//选择排序,第k轮可以求得第k大的数字
int n=nums.size();
for(int i=0;i<k;i++)
{
int maxIndex=i;
for(int j=i+1;j<n;j++)
{
if(nums[j]>nums[maxIndex])
maxIndex=j;
}
int temp=nums[i];
nums[i]=nums[maxIndex];
nums[maxIndex]=temp;
}
return nums[k-1];
}
};
方法二:分治
快速排序,每次确定一个数的位置,如果倒数第k个数的位置确定了,那就找到了倒数第k个数
class Solution {
public:
//比flag大的放左边,比flag小的放右边,返回flag的坐标
int findFlag(vector<int>& nums,int start,int end)
{
if(end<=start)
return start;
int flag=nums[start];
int left=start;
int right=end;
while(left<right)
{
//在右边找一个比flag小的数字
while(left<right&&nums[right]>flag)
right--;
//把右边那个比flag小的数字放到左边的空位上
nums[left]=nums[right];
//在左边找一个比flag大的数字
while(left<right&&nums[left]<=flag)
left++;
//把左边那个比flag小的数字放到右边的空位上
nums[right]=nums[left];
}
//最后把flag放在left那个位置上
nums[left]=flag;
return left;
}
//排序,如果倒数第k个数被排到了那就结束
void quickSort(vector<int>& nums,int start,int end,int k)
{
if(start>=end)
return ;
int n=nums.size();
int flag=findFlag(nums,start,end);
if(flag==n-k)
return;
//在左边排序
quickSort(nums,start,flag-1,k);
quickSort(nums,flag+1,end,k);
}
int findKthLargest(vector<int>& nums, int k) {
quickSort(nums,0,nums.size()-1,k);
return nums[nums.size()-k];
}
};