Leetcode-在未排序的数组中找到第 k 个最大的元素(中等)

在未排序的数组中找到第 k 个最大的元素

//快排
//注意找到轴值的索引等于k即可停止,大于k时排左边,否则排右边
class Solution {
public:
    int QuickSort(vector<int>& nums, int left, int right, int k) {
        //if(left>=right)一定能找到,所以不需要考虑一边全遍历完的情况
        int central = partition(nums, left, right);
        if (central == k)
            return nums[central];
        if (central > k)
            return QuickSort(nums, left, central - 1, k);//什么时候找到什么时候return
        else
            return QuickSort(nums, central + 1, right, k);
    }
    int partition(vector<int>& nums, int left, int right) {
        srand(time(0));
        int pivot = rand() % (right - left + 1) + left;
        swap(nums[left], nums[pivot]);
        int lt = left;//less than 小于等于lt的一定是小于privot元素的
        for (int i = left + 1; i <= right; i++) {
            if (nums[i] < nums[left])
            {
                lt++;
                swap(nums[lt], nums[i]);
            }
        }
        swap(nums[left], nums[lt]);
        return lt;//中心位置
    }
    int findKthLargest(vector<int>& nums, int k) {

        return QuickSort(nums, 0, nums.size() - 1, nums.size() - k);
    }
};

快排排序:

    //需要两个函数
//void QuickSort(vector<int>& nums, int left, int right)用来递归,找到轴值,递归左右两边
//int partition(vector<int>& nums, int left, int right) 负责找到轴值,小于它的放左边,大于它的放右边,并返回中心轴值所在索引

class Solution {
public:
    void QuickSort(vector<int>& nums, int left, int right) {
        if (left >= right)//当左边没有元素的时候,会出现left<right的情况;只有一个元素时相等
            return;
        int central = partition(nums, left, right);//找到轴值,把低于它的放左边,高于他的放右边
        QuickSort(nums, left, central - 1);//继续对左边排序
        QuickSort(nums, central + 1, right);//继续对一边排序
    }
    int partition(vector<int>& nums, int left, int right) {
        srand(time(0));
        int pivot = rand() % (right - left + 1) + left;//找到随机轴值,交换至首位
        swap(nums[left], nums[pivot]);
        int lt = left;//less than      lt的本身和左边一定是小于privot元素的,从首位开始
        for (int i = left + 1; i <= right; i++) {//i从首位右边开始遍历,大于轴值的不动,小于轴值的交换
            if (nums[i] < nums[left])
            {
                lt++; //lt右移,腾出位置将小于的值交换过来,保持lt左边和本身都是小于轴值的
                swap(nums[lt], nums[i]);
            }
        }
        swap(nums[left], nums[lt]);//将首位的轴值交换到lt位置 此时:小于 轴值 大于
        return lt;//轴值所在的中心位置
    }
    void findKthLargest(vector<int>& nums) {
        QuickSort(nums, 0, nums.size() - 1);
    }
};
全部评论

相关推荐

01-14 10:23
已编辑
湖南师范大学 计调
太久没更新,前几天看到一条评论,说“牛客就是当年那群做题区毕业了开始找工作还收不住那股味”的群体。字里行间透着居高临下的评判,不是,他该不会以为自己很幽默?很犀利吧?作为在牛客混了不算短日子的用户,我感到的不只是被冒犯,更是一种深刻的悲哀——这种以“松弛感”为名,对另一种生存策略的轻蔑,颇有一种自己考不上大学早早出来混社会,嘲笑考上大学的人是书呆子,然后大言不惭地说:死读书有什么用,人脉和资源才是硬道理。我不知道说这个话的人,手头究竟握着多少真正管用的人脉与资源,也不知道他这么傲慢地说出“那股味”的时候,是站在哪一个巨人的肩膀上,才能如此“松弛从容”地俯视众生,还能品评出别人身上“没收住”的余...
淬月星辉:这种评论把正常的努力扭曲成卷😂,说白了就是自己不努力,看着身边努力的人一个个都事业有成了,自己的心里开始不平衡了,就发这种酸言酸语。牛客可以说是我用过那么多平台里社区氛围最好的论坛了,用了大半年了,基本上没见过有人吵架的,都是在互帮互助提建议,帮忙看简历的,帮忙选offer的,帮忙指点学习路线的,分享工作经验和趣事的,我觉得这才是互联网该有的样子。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务