算法分析与设计丨第二周丨LeetCode(3)——Kth Largest Element in an Array(Medium)

分治法

题目链接:点击打开链接

一开始我感觉就是个排序的题目,于是便用了类似快排的方法来做,因为经过与同学的讨论后,知道了快排本来就是每一遍都求第k个最大的数,题目便可解了。

听了课之后,发现这就是老师所说的selection问题


class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        int left = 0,right = nums.size() - 1;
        while(left < right)//其实类似于快排,
        {
            int myleft = left,myright = right;
            int find = nums[myleft];//定为中间枢纽,用find来保留值
            
            while(myleft < myright)//要做到myleft与myright相等
            {
                while(myleft < myright && nums[myright] < find)//注意审题,一开始我还弄反了
                    --myright;
                nums[myleft] = nums[myright];
            
                while(myleft < myright && nums[myleft] >= find)
                    ++myleft;
                nums[myright] = nums[myleft];
                
            }
            
            
            nums[myleft] = find;
            
            if(k-1 == myleft)//因为快排的每一遍其实就是在找第k个大的元素
                return nums[myleft];
            else if(k-1 > myleft)//所求在当前枢纽的右边
                left = myleft + 1;
            else//在左边
                right = myleft - 1;
        }
        return nums[k-1];//就是在那个位置
        
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值