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-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
03-16 11:19
已编辑
门头沟学院 Java
已经一年没发牛客了,为什么呢,因为没脸发...&nbsp;一年前的我自认为在25届中技术一流,八股无敌,项目出色,但是一年校招的蹉跎让我差点转行。24年春招收割了十几个实习&nbsp;offer&nbsp;之后我去了某家大厂实习到9月份转正失败,那时候的我还没有意识到噩梦将来,7月因为投秋招提前批没反馈,于是开始投了几个实习转正岗位练手又拿了3个中大厂&nbsp;offer,这时的我沉浸在我自以为是的骄傲里。9月秋招正式批开始后我几乎把我能找到的所有的岗位都投了一遍,只收获了大厂海笔,0面试。10月份第一家给我面试的公司是数字马力(蚂蚁的内包),诚恳的说,当时收到这家面试是嚣张的,觉得我拿这个&nbsp;offer&nbsp;如探囊取物,就当个保底吧。...
中街牛奶提子:是啊,不应该在秋招的时候继续投实习岗。也劝26届的,八月末后,实习岗就不应该投,给人错误的行情认知。佬是学院本,觉得约面难,双非何尝不是一样呢,秋招战场的激烈和实习完全不同。当时我秋招的时候也是边面实习,当时面实习面一个过一个觉得自己很优越,觉得能收获一堆实习offer那秋招肯定也行。为什么要在秋招拿一堆实习offer增强自己所谓的虚荣心,当时就是贱,为了所谓的攀比虚荣心
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务