c++建堆(优先级队列)

数组中的第K个最大元素。

该算法解法很多,最简单的就是排序,然后取matrix[k]。

2.还有就是快速排序

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        
        int lo = 0, hi = nums.size();
        while (lo < hi)
        {
            int pre = lo + 1;
            for (int suc = pre; suc < hi; suc++)
            {
                if (nums[lo] < nums[suc])swap(nums[pre++], nums[suc]);
            }
            swap(nums[lo], nums[pre - 1]);
            if (pre == k)return nums[pre - 1];
            else if (pre > k)hi = pre;
            else lo = pre;
        }
        return -1;
    }
};

3.我个人比较喜欢堆,因为堆很炫酷。

采用一个大小为k的小顶堆,n-k的大顶堆,任意的将数组的元素放进去。

本身是想用这个算法的,但是建堆的话要用priority_queue,这样会耗费很多内存o(n),时间也是o(logn),用该方法已经可以将数组排序!

这时候就要考虑原地建堆的方式来建立大顶堆和小顶堆了。


头文件#include ,STL在<algorithm.h>中实现了对存储在数组或vector中的元素进行堆操作的函数,包括make_heap, pop_heap, push_heap, sort_heap。
【两层:上层heap,底层vector(或数组)】,即用数组或vector数据容器来实现堆。
默认情况下是max-heap,该大顶堆实际上是以一个vector表现的完全二叉树。
make_heap( ):建立堆(要么大顶堆,要么小顶堆)
push_heap( ): 在堆中添加元素
pop_heap( ): 在堆中删除元素
sort_heap( ): 堆排序

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        make_heap(nums.begin(), nums.begin() + k, greater<int>());//1-k建立小顶堆
        make_heap(nums.begin() + k, nums.end());//k+1到end建立大顶堆
        if (k == nums.size())return nums[0];
        while (nums[0] < nums[k])
        {
            pop_heap(nums.begin(), nums.begin() + k,greater<int>());
            pop_heap(nums.begin() + k, nums.end());
            swap(nums[k - 1], nums.back());
            push_heap(nums.begin(), nums.begin() + k, greater<int>());
            push_heap(nums.begin() + k, nums.end());
        }
        return nums[0];
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值