leetcode——215.数组中的第K个大元素

本文介绍了一种利用快速排序的partition过程来高效寻找数组中第K大元素的方法。通过随机选取枢轴并进行分区操作,可以有效减少搜索范围,实现O(n)平均时间复杂度的查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

  1. 利用快排的partition确定第k大的位置在哪
  2. 快排的递归条件为三个 是否找到,没有找到接下来往左递归还是往右递归?
  3. 为了加快算法速度,引入随机种子,每次挑选不一样的中枢

代码:

class Solution {
public:
    //根据返回的q与index的关系,决定是否继续递归,向哪边递归
    int quickSelect(vector<int>& a, int l, int r, int index) {
        int q = partition(a, l, r);
        if (q == index) 
            return a[q];
        else
            return q < index ? quickSelect(a, q + 1, r, index) : quickSelect(a, l, q - 1,index);
    }
    //快排的Partition
    inline int partition(vector<int>& a, int l, int r) {
    	//引入随机种子,加快算法效率
        srand(time(0));
        int random = rand() % (r - l + 1) + l;
        swap(a[random], a[l]);
        //正常快排的partition步骤
        int x = a[l];
        while(l<r){
            while(l<r&&a[r]>=x) r--;
            a[l]=a[r];
            while(l<r&&a[l]<=x) l++;
            a[r]=a[l];
        }
        a[l]=x;
        return l;
    }
    //主函数 第k大的元素在数组中的index为nums.size()-k;
    int findKthLargest(vector<int>& nums, int k) {
        return quickSelect(nums, 0, nums.size() - 1, nums.size() - k);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值