NC88 寻找第K大

该博客介绍了一种利用快速排序的思路解决寻找整数数组中第K大元素的方法。通过实现一个名为`findKth`的函数,结合辅助的`fastSort`函数,可以在数组中有效地找到第K大的数。在`fastSort`函数中,通过中轴值与K的关系来决定排序的边界,从而避免不必要的排序操作,提高了效率。

题目描述:

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(1<=K<=n),请返回第K大的数(包括重复的元素,不用去重),保证答案存在。

解题分析:

借鉴快排思路,主要是可以判断中轴与K的关系,以此来判断是否是第K大数,或者中轴大于K时就没必要将右边的数进行快排了,节省复杂度。

class Solution {
public:
    int findKth(vector<int> a, int n, int K) {
        // write code here
        if(n<K || n<=0)
            return 0;
        fastSort(a, 0, n-1,K);
        return a[K-1];
    }
    
    void fastSort(vector<int>& nums, int begin, int end, int K){
        if(begin>end)
            return;
        int left=begin;
        int right=end;
        int key=nums[left];
        while(left<right){
            while(left<right && nums[right]<key)
                right--;
            nums[left]=nums[right];
            while(left<right && nums[left]>=key)
                left++;
            nums[right]=nums[left];
        }
        nums[left]=key;
        if(left==K-1){
            return;
        }
        else if(left>K-1){
            fastSort(nums,begin,left-1,K);
        }
        else{
            fastSort(nums,begin,left-1,K);
            fastSort(nums,left+1,end,K);
        }

        return;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值