力扣 -- 215. 数组中的第K个最大元素

力扣 -- 215. 数组中的第K个最大元素_第1张图片

解题步骤:

力扣 -- 215. 数组中的第K个最大元素_第2张图片

力扣 -- 215. 数组中的第K个最大元素_第3张图片

力扣 -- 215. 数组中的第K个最大元素_第4张图片

力扣 -- 215. 数组中的第K个最大元素_第5张图片

力扣 -- 215. 数组中的第K个最大元素_第6张图片

力扣 -- 215. 数组中的第K个最大元素_第7张图片

力扣 -- 215. 数组中的第K个最大元素_第8张图片

力扣 -- 215. 数组中的第K个最大元素_第9张图片

力扣 -- 215. 数组中的第K个最大元素_第10张图片

力扣 -- 215. 数组中的第K个最大元素_第11张图片

力扣 -- 215. 数组中的第K个最大元素_第12张图片

参考代码:

class Solution {
public:
    int QuickSelectSort(vector& nums,int begin,int end,int k)
    {
        //随机选key
        int key=nums[begin+rand()%(end-begin+1)];
        //left在左端点前一个位置
        int left=begin-1;
        //right在右端点后一个位置
        int right=end+1;
        //cur从begin开始遍历
        int cur=begin;

        //当cur和right相遇就结束循环,因为[right,end]区间内的值是
        //比key大的,cur与right相遇就说明整个数组已经全部遍历过了
        while(curkey)
            {
                swap(nums[--right],nums[cur]);
            }
            //==key就跳过
            else
            {
                cur++;
            }
        }

        //a,b,c参考图片含义
        int a=left-begin+1;
        int b=(right-1)-(left+1)+1;
        int c=end-right+1;
        //参考图片判断规则
        if(c>=k)
        {
            return QuickSelectSort(nums,right,end,k);
        }
        else if(b+c>=k)
        {
            return nums[left+1];
        }
        else
        {
            return QuickSelectSort(nums,begin,left,k-b-c);
        }
    }

    int findKthLargest(vector& nums, int k) {
        srand((unsigned int)time(nullptr));
        return QuickSelectSort(nums,0,nums.size()-1,k);
    }
};

以上就是这道topk问题基本上算是最优的算法了,时间复杂度无限逼近与O(N)的,这个快速选择算法是一个效率非常牛的算法哦!你学会了吗?如果你感觉到有所帮助,那么点点小心心,点点关注呗,后期还会持续更新力扣的经典题目哦,我们下期见!!!!

你可能感兴趣的:(力扣经典面试题,leetcode,算法,职场和发展,c语言,c++,数据结构,排序算法)