leetcode 215 找第k大的元素(线性期望时间选择问题)

其实线性期望时间的选择问题就是使用快速排序的方法,不过相较于快速排序需要对枢纽值两边进行递归,找第k大元素只需要对枢纽值的一边进行递归;

因此其平均时间复杂度为O(N)=N+N/2+N/4+...<2N,不过该方法的最坏情况的时间复杂度为O(N^2)。

    void swap(vector<int> &nums,int i,int j)
    {
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }
    int findMedia(vector<int> &nums,int l,int r)
    {
        int cen=(l+r)/2;
        if(nums[cen]<nums[l])
        {
            swap(nums,cen,l);
        }
        if(nums[r]<nums[l])
            swap(nums,l,r);
        if(nums[r]<nums[cen])
            swap(nums,cen,r);
        swap(nums,cen,r-1);
        return nums[r-1];
    }
    int quicksort(vector<int> &nums,int l,int r)
    {
        int m=findMedia(nums,l,r);
        int i=l,j=r-1;
        if(i==j)
            return l;
        for(;;)
        {
            while(nums[++i]<m);
            while(nums[--j]>m);
            if(i<j)
                swap(nums,i,j);
            else
                break;
        }
        swap(nums,i,r-1);
        return i;
    }
    int findKthLargest(vector<int>& nums, int k) {
        int len=nums.size();
        if(len==1)
            return nums[0];
        k=len-k+1;
        int l=0,r=len-1;
        while(l<r)
        {
            int m=quicksort(nums,l,r);
            if(m+1==k)
                return nums[m];
            else if(m+1>k)
            {
                r=m-1;
            }
            else
            {
                l=m+1;
            }
        }
        return nums[l];
    }

 

posted on 2020-02-29 22:33  QingFengDaHui  阅读(179)  评论(0编辑  收藏  举报

导航