Kth Largest Element in an Array(数组中第K大元素)

本文介绍了一种基于快速排序思想寻找未排序数组中第K大元素的有效算法。该算法通过不断划分数组并缩小搜索范围来提高效率,最终达到平均时间复杂度O(nlogn)。文中提供了一个具体的C++实现示例。

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

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

For example,
Given [3,2,1,5,6,4] and k = 2, return 5.

Note: 

You may assume k is always valid, 1 ≤ k ≤ array's length.



数组中第K大元素:


基本原理:利用快速排序的方法,每次将序列分成两部分,

且两部分元素具有以下性质:一部分的任意元素大于另一部分的一部分任意元素,

即:若两部分元素个数分别为a和b,则最大的a个元素在第一部分中,其余的在另一部分中。

基于上述原理,可以每次都将搜索范围减少,若k<=a,则将搜索范围锁定到第一部分,若k>a,则将搜素范围锁定到第二部分。

直至最后范围中仅有一个元素,即为所求的第K大元素。


平均时间复杂度为O(nlog n)



class Solution {
public:
int findKthLargest(vector<int>& nums, int k, int a = -1, int b = -1) {
        int size = nums.size();
        if(a == -1 && b == -1){
            a = 0, b = size;
        }
        if((b - a) == 1){
            return nums[a];
        }
        int i = a, j = b-1;
        while(i < j) {
            while(i < j)
                if (nums[i] < nums[j]){
                    int t = nums[i];
                    nums[i] = nums[j];
                    nums[j] = t;
                    ++i;
                    break;
                }
                else{
                    --j;
                }
            while(i < j) {
                if (nums[i] < nums[j]){
                    int t = nums[i];
                    nums[i] = nums[j];
                    nums[j] = t;
                    --j;
                    break;
                }
                else{
                    ++i;
                }
            }
        }
        if(i >= (k-1)){
            return findKthLargest(nums, k, a, i+1);
        }
        else{
            return findKthLargest(nums, k, i+1, b);
        }
}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值