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

LEEDCODE 215数组中的第K个最大元素_第1张图片

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
       int left = 0;
       int right = nums.size()-1;
       int flag = 0;
       // int flag;
       // quicksort(nums, left, right, k, flag);
       build_maxheap(nums,right, flag);
       heapsort(nums,k, flag);
       return flag;
    }
    void heapsort(vector<int>& nums, int k, int& flag)
    {
        int right = nums.size()-1;
        for(int i = 0; i<k; i++)
        {
           swap(nums[0],nums[right-i]);
           if(right-i-1>=0)
                maxheap(nums, 0, right-i-1, flag);
        }
        flag = nums[nums.size()-k];

    }
    void maxheap(vector<int>& nums, int top, int right,int& flag)
    {
        int cur = top;
        int son = 2*cur+1;
        if(son > right)
            return;
        if((son+1)<=right && nums[son]<= nums[son+1])
            son += 1;
        if(nums[son]>nums[cur])
        {
            swap(nums[son], nums[cur]);
            cur = son;
            maxheap(nums, cur, right,flag);
        }
        
    }
    void build_maxheap(vector<int>& nums, int right,int& flag)
    {
        int son;
        int cur;
        for(int i = (right+1)/2-1; i>=0; i--)
        {
            maxheap(nums, i, right, flag);
        }
    }
    void swap(int& a, int& b)
    {
        int tmp=a;
        a=b;
        b=tmp;
    }
};

LEEDCODE 215数组中的第K个最大元素_第2张图片
Thinking:
1 快排超时 orz 40/41.。。。。。。。。。。。。。。。。。。。。。

2 快排和堆排复杂度都是nlogn,找个数,堆排要快些 n?

3 超出范围 多了一个right = right-i-1

4 出错 if(son > right) return; 多了个等于号

5 if((son+1)<=right && nums[son]<= nums[son+1]) 是有顺序的!

你可能感兴趣的:(算法)