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

题目:

215. 数组中的第K个最大元素_第1张图片
解法一、优先级队列

代码

#include
class Solution {
public:
    int findKthLargest(vector& nums, int k)
    {
      //使用优先级队列直接秒杀!
      priority_queue,less> q;
        for(int i=0;i

思路:

因为是使用的优先级队列,所以要求第K个大的元素,只需要将数组POP (k-1)次,然后再取队列的队头元素即可!!

解法二:自己手撕堆结构,进行排序,然后取第k个元素即可!

其中优先级队列利用的其实就是堆结构!建堆解决此问题的原理就是和优先级队列是一样的!算法思路和优先级队列一样,这里仅仅给出代码参考即可!不会的可以评论区继续讨论!

#include
class Solution{
public:

void adjustdown(vector&arr,int n,int i)
{
    int child=i*2+1;
    while(childarr[child+1])
        {
            child++;
        }
        if(arr[child]& nums, int k)
    {
        //首先进行建堆!
        int n=nums.size();
        for(int i=(n-1-1)/2;i>=0;i--)
        {
            adjustdown(nums,n,i);
        }
        int end = n - 1;
        while (end >0)
        {
        swap(nums[0], nums[end]);
        adjustdown(nums, end, 0);
        --end;
        }
        return nums[k-1];
    }
};

解法三、基于快排的快速选择!

代码:

class Solution {
public:

    int getkey(vector&nums,int left,int right)
    {
        int r=rand();
        return nums[r%(right-left+1)+left];
    }
    int qsort(vector&nums,int left,int right,int k)
    {
        int l=-1,r=right+1;
        int i=0;
        int key=getkey(nums,left,right);
        while(ikey)
            {
                swap(nums[--r],nums[i]);
            }
            else
            {
                i++;
            }
        }

        int a=l-left+1;
        int b=r-l-1;
        int c=right-r+1;

        if(c>=k)
        {
            return qsort(nums,r,right,k);
        }
        else if(b+c>=k)
        {
            return key;
        }
        else
        {
            return qsort(nums,left,l,k-b-c);
        }
        return 0;
    }
    int findKthLargest(vector& nums, int k) 
    {
            srand(time(NULL));
            //基于快排的优化求topk问题!
            int n=nums.size()-1;
            int s=qsort(nums,0,n,k);
            return s; 
    }
};

思路:其中此思路是利用快排的思想,将整个数组划分为三大块,分别为大于key  等于key和小于key这三大块!然后求出每块的个数,再与K进行比较,来判断是否继续进行递归寻找,此方法的快速之处在于:一旦确定了在哪一块,直接就可以将其中两块抛弃掉!大大降低了寻找时间!

你可能感兴趣的:(数据结构,排序算法,学习方法,c++)