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);
    }
};
全部评论

相关推荐

hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务