首页 > 其他分享 >前K个高频元素 347 暴力法和优先级队列

前K个高频元素 347 暴力法和优先级队列

时间:2024-01-15 09:01:17浏览次数:33  
标签:node count vector 优先级 val 队列 next int 347


关于暴力法简单说一点,我是用链表进行比较排序的,但是有一个细节要注意。

点击查看代码
 struct node{
        int val;
        int count;
        node*next;
        node(int val,int count):val(val),count(count),next(nullptr){}
    };
关于节点的构造函数,一定要构造全,最开始的时候,没有对next进行初始化,这就可能会产生野指针。 具体代码:
点击查看代码
class Solution {
    struct node{
        int val;
        int count;
        node*next;
        node(int val,int count):val(val),count(count),next(nullptr){}
    };
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        node*head=new node(0,0);
map<int,int>cnt,fin;
vector<int>v;
for(int i=0;i<nums.size();i++){
    ++cnt[nums[i]];
}
for(map<int,int>::iterator it=cnt.begin();it!=cnt.end();it++){
    node*p=new node(it->first,it->second);
    node*a=head;
    while(a->next&&a->next->count>p->count){a=a->next;}
    p->next=a->next;
    a->next=p;
}
node*p=head->next;
while(p&&k){
    v.push_back(p->val);
    p=p->next;
    --k;
}

return v;
    }
};

关键的是接下来的优先级队列
这是基于大根堆和小根堆来实现的,插入的时候自动排序,专门可以解决前K元素这样的问题。
有几个关键的点:
1,自定义的初始化函数
2.如何利用根堆的特性解决问题。

1 自定义的初识化函数
默认形式是:std::priority_queue pq; // 默认是大顶堆,使用 std::less 进行比较
相当于std::priority_queue<int, std::vector, std::less> pq;
如果需要小根堆,就std::priority_queue<int, std::vector, std::greater> pq; // 小顶堆
从less和greater可以看出它的定义是跟他实际逻辑相反的。
自己定义一个类也可以实现,priority_queue<pair<int,int>,vector<pair<int,int>>,mcompare>q;

点击查看代码
class mcompare{
    public:
bool operator()(pair<int,int>&s,pair<int,int>&r){
    return s.second>r.second;
}
};

还有这个vector<pair<int,int>>是优先级队列的底层容器,底层容器是实际存储元素的容器,它需要提供一些特定的操作,例如push、pop、top。

2如何利用根堆的特性解决问题。
一定是先插入元素,如果元素数大于K,再进行删除元素。
只有这样才能将插入的元素,进行根堆处理。

还有要注意的点是删除每次都是删除堆顶,因此高频元素就要用小根堆,每次把小的元素删除。
完整代码:

点击查看代码
class Solution {  
public:
class mcompare{
    public:
bool operator()(pair<int,int>&s,pair<int,int>&r){
    return s.second>r.second;
}
};
    vector<int> topKFrequent(vector<int>& nums, int k) {    
map<int,int>cnt;
vector<int>v(k);
for(int i=0;i<nums.size();i++){
    ++cnt[nums[i]];
}
priority_queue<pair<int,int>,vector<pair<int,int>>,mcompare>q;
for(map<int,int>::iterator it=cnt.begin();it!=cnt.end();it++){
    q.push(*it);
    if(q.size()>k){
        q.pop();
    }
}
for(int i=q.size()-1;i>=0;i--){
    v[i]=q.top().first;
    q.pop();
}

return v;
    }
};

标签:node,count,vector,优先级,val,队列,next,int,347
From: https://www.cnblogs.com/yun-che/p/17964610

相关文章

  • 滑动窗口的最大值 239 单调队列初识
    最开始做的时候,暴力解法结果不管怎么剪枝,还是超时了。后来看到了卡哥的方法,学到了单调队列,其实就是自定义队列。用deque来实现。有三个关键点:pop,push,front.pop,如果遍历的元素等于队头元素,则头删。push,把比遍历元素小的都进行尾部删。front,就是普通的查找队头。循环遍历的时......
  • CF-514-D-单调队列
    514-D题目大意给定\(n\)个人,每个人有\(m\)个属性,第\(i\)个人的第\(j\)个属性值为\(a[i][j]\)。最多可以执行\(k\)次操作,每次操作选定一个属性,把所有人的该属性减\(1\),求一段最长的区间,满足执行所有操作之后该区间中所有人的所有属性全部为\(0\)。Solution转换一下思考方向,求......
  • 栈和队列
    栈和队列目录栈和队列栈栈的基本定义顺序栈链栈栈栈的基本定义栈是一种特殊的线性表,特点是先进后出栈的操作只能在表的一端进行,出栈和入栈都只能在栈顶(表尾)进行栈的两种实现:顺序栈和链栈顺序栈采用数组,用一个指针指向栈顶双向顺序栈(空间利用率更高)两个栈栈尾是数组的头......
  • js 队列方法
    就像栈是以LIFO形式限制访问的数据结构一样,队列以先进先出(FIFO,First-In-First-Out)形式限制访问。队列在列表末尾添加数据,但从列表开头获取数据。因为有了在数据末尾添加数据的push()方法,所以要模拟队列就差一个从数组开头取得数据的方法了。这个数组方法叫shift(),它会删除......
  • 第二章 Spring Boot 整合 Kafka消息队列 生产者
    ​ 系列文章目录第一章Kafka配置部署及SASL_PLAINTEXT安全认证第二章  SpringBoot整合Kafka消息队列 生产者第三章  SpringBoot整合Kafka消息队列 消息者(待续) 前言        Kafka是一个消息队列产品,基于Topicpartitions的设计,能达到非常高的消息......
  • 刷题笔记——队列(C++)
    1696.跳跃游戏VI-力扣(LeetCode)给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。一开始你在下标 0 处。每一步,你最多可以往前跳 k 步,但你不能跳出数组的边界。也就是说,你可以从下标 i 跳到 [i+1,min(n-1,i+k)] 包含 两个端点的任意位置。你的目标是......
  • 21-优先级调度:你必须掌握的 Pod 抢占式资源调度
    随着我们在Kubernetes集群中部署越来越多的业务,势必要考虑集群的资源利用率问题。尤其是当集群资源比较紧张的时候,如果此时还要部署一些比较重要的关键业务,那么该如何去提前“抢占”集群资源,从而使得关键业务在集群中跑起来呢?这里一个最常见的做法就是采用优先级方案。通过给P......
  • SpringBoot配置加载优先级
    优先级:命令行参数>环境变量>配置文件1.命令行参数配置java-jar-Dserver.port=8000ruoyi-admin.jar2.环境变量配置linux系统环境:#申明环境变量exportSERVER_PORT=10000#执行jar包java-jardemo.jarwindow系统环境:idea中:java-jar命令使用环境变量需要再win系统环境变量中......
  • 栈和队列
    栈的变种,迎面增长的栈和底部相连的栈错误只是rear和front指针在移动如果是虚指针   转进制,1234除以8的余数为2、2、3、2。再倒序输出,选B虚指针。25-29有5个数,11-5=6.最后一个数据的下标为5,rear只是对队尾元素的后一个位置,所以是6.入栈顺序是123456,出栈顺序是2654......
  • 长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务
    什么是Java事件在Java中,"event"(事件)通常用于指代一种在特定条件下触发的通知或者信号。在Java编程中,事件代表着程序中发生的某种动作或改变,例如用户的交互操作、状态的转换,或者其他外部因素触发的通知。Java中的事件通常与事件监听器(EventListener)和事件处理器(EventHandler)一起使......