力扣215:数组中第K大最大元素

一,题目描述

题目链接

给定一个数组,求这个数组中第K大的数字。示例如下:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

二, 思路

可以使用快排的思想解决这个问题,因为每次快排之后都会有一个数字归位。而且快排采用分治的策略,查找速度很快。
所以可以利用快排之后数字的下标和第几大K进行对比,如果等于就是找到了,如果小于,说明在快排的右半边,大于在左半边,从而找到正确的数字。
这里需要转变一下的是需要将第几大转化成第几小,因为数组是从小到大排序的,所以需要转换一下。

三,实现

class Solution {
public:
    int position(vector<int>& nums, int left, int right)//快排的关键
    {
        int tmp = nums[left];
        while(left < right)
        {
            while(left < right && nums[right] > tmp)
            {
                right--;
            }
            if(left < right)
            {
                nums[left] = nums[right];
            }
            while(left < right && nums[left] <= tmp)
            {
                left++;
            }
            if(left < right)
            {
                nums[right] = nums[left];
            }
        }
        nums[left] = tmp;
        return left;
    }
    int randposition(vector<int>& nums, int left, int right)
    {
        int tmp = rand() % (right - left + 1) + left;
        swap(nums[left], nums[right]);
        return position(nums, left, right);
    }
    int quicksort(vector<int>& nums, int left, int right, int k)//找第K大
    {
            
            int pos = randposition(nums, left, right);
            int j = pos + 1;
            if(j == k)
            {
                return nums[pos];
             }
            else 
            {
                return j < k ? quicksort(nums, pos+1, right, k) : quicksort(nums,left,pos-1,k);
            }
           
        
    }
    int findKthLargest(vector<int>& nums, int k) {
        srand(time(0));
        return quicksort(nums, 0, nums.size()-1, nums.size()-k+1);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值