数组中第K个最大元素

参考: 堆排序


方法一: 利用c++中的priority_queue建立小顶堆。

    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int,vector<int>,greater<int>> minHeap; //加一个greater<int>构造小顶堆,不加默认构造大顶堆
        int len = nums.size();
        bool globalStatus = false;
        if(len <= 0 || k < 0 || k > len)
        {
            globalStatus = true;
            return 0;
        }
        for(int i = 0; i < len;i++)
        {
            if(minHeap.size() < k)
                minHeap.push(nums[i]);
            else if(nums[i] > minHeap.top()){
                minHeap.pop();
                minHeap.push(nums[i]);
            }
        }
        return minHeap.top();
    }

方法二:与方法一相同,但是自己构造小顶堆(初始建堆重建堆)

    int findKthLargest(vector<int>& nums, int k) {
        vector<int> heap(k);
        for(int i = 0;i < k;i++){
            heap[i] = nums[i];
        }
        for(int i = k/2 - 1;i >= 0;i--){ //从最后一个父节点开始,对每个父节点进行调整操作
            min_Heapify(heap, i, k);//从下至上初始化堆
        }
        for(int i = k;i < nums.size();i++){ //数组后面的数是否进堆
            if(nums[i] > heap[0])
            {
                heap[0] = nums[i]; //进堆
                min_Heapify(heap, 0, k);//堆化,找到新加的数在堆中合适的位置
            }
        }
        return heap[0];
    }
    void min_Heapify(vector<int>& nums,int start,int end){
        int dad = start;
        int son = dad * 2 + 1;
        int tmp = 0;
        while(son < end){
            if (son + 1 < end && nums[son] > nums[son + 1])
			    son++;
            if(nums[dad] > nums[son])
            {
                tmp = nums[son];
                nums[son] = nums[dad];
                nums[dad] = tmp;
                dad = son;
                son = dad * 2 + 1;
            }
            else
                break; //默认左右子树已是堆
        }
        return;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值