算法------(10)堆

例题:(1)AcWing 838. 堆排序

        我们可以利用一个一维数组来模拟堆。由于堆本质上是一个完全二叉树,他的每个父节点的权值都小于左右子节点,而每个父节点编号为n时,左节点编号为2*n,右节点编号为2*n+1。用size记录堆的大小便于维护。在初始建立堆时,由于最后一层在前面每一层建立后自然而然就会被排序,因此我们只需要从倒数第二层开始建立到第一层即可。建立的过程利用到down操作,down操作本质上就是在父节点和两个子节点中进行比较换位,直到往下也不需要换位。而由于一维数组不方便删除头结点,但是删除尾节点只需要size--,因此我们删除头节点的操作就是把头结点和尾结点交换,然后把新的头节点down。 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int heap[N],sz;
void down(int u){
    int t = u;
    if(u*2<=sz&&heap[u*2] < heap[t]) t = u*2;
    if(u*2+1<=sz&&heap[u*2+1] < heap[t]) t = u*2+1;
    if(t!=u){
        swap(heap[t],heap[u]);
        down(t);
    }
}
int main()
{
    int n,m;
    scanf("%d%d", &n, &m);
    for(int i = 1;i<=n;i++){
        scanf("%d", &heap[i]);
    }
    sz = n;
    for(int i = n/2;i;i--){
        down(i);
    }
    while(m--){
        printf("%d ",heap[1]);
        heap[1] = heap[sz--];
        down(1);
    }
    return 0;
}

(2)AcWing 839. 模拟堆  

        模拟堆的过程相比上面多了几个操作:(1)删除第k个数,修改第k个插入的数,需要用一个记录下标-第k个插入的数和相反关系的两个数组进行维护。(2)还需要用up把下面的较小数往上移。 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
unordered_map<int,int> id,mp;//id的对应关系:下标-第k个插入的数,mp的对应关系: 第k个插入的数 - 下标 
int h[N];
int sz,cnt;
void down(int u){
    int t = u;
    if(u*2<=sz&&h[u*2]<h[t]) t = u*2;
    if(u*2+1<=sz&&h[u*2+1]<h[t]) t = u*2+1;
    if(t!=u){
        swap(mp[id[u]],mp[id[t]]);
        swap(id[u],id[t]);
        swap(h[u],h[t]);
        down(t);
    }
}
void up(int u){
    int t = u;
    if(u/2&&h[u/2]>h[t]) t = u/2;
    if(t!=u){
        swap(mp[id[u/2]],mp[id[u]]);
        swap(id[u/2],id[u]);
        swap(h[u/2],h[u]);
        up(t);
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 0;i<n;i++){
        char op[5];
        scanf("%s",op);
        if(!strcmp(op,"I")){
            int x;
            scanf("%d", &x);
            h[++sz] = x;
            mp[++cnt] = sz;
            id[sz] = cnt;
            up(sz);
        }
        else if(!strcmp(op,"PM")){
            printf("%d\n",h[1]);
        }
        else if(!strcmp(op,"DM")){
                swap(mp[id[1]],mp[id[sz]]);
                swap(id[1],id[sz]);
                swap(h[1],h[sz]);
                sz--;
                down(1);
        }
        else if(!strcmp(op,"D")){
                int k;
                scanf("%d", &k);
                k = mp[k];
                swap(mp[id[k]],mp[id[sz]]);
                swap(id[k],id[sz]);
                swap(h[k],h[sz]);
                sz--;
                down(k);
                up(k);
        }
        else{
            int x,k;
            scanf("%d%d", &k, &x);
            k = mp[k];
            h[k] = x;
            down(k);
            up(k);
        }
    }
    return 0;
}

练习:(1)Leetcode 692.前k个高频单词         没做出来。。优先队列居然还能这么用的吗。。

         先用哈希表统计每个单词出现的次数,然后遍历哈希表(可以用auto直接循环),把每个<string,pair>加入到优先队列进行排序。最后由于需要按照字典序排序,我们还需要从后往前放置答案。

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map<string,int> x;
        for(auto c:words){
            x[c]++;
        }

        auto cmp = [](const pair<string,int> &a,pair<string,int> &b){
            return a.second == b.second ? a.first < b.first : a.second > b.second;
        };
        priority_queue<pair<string,int>,vector<pair<string,int>>, decltype(cmp)> ans(cmp);
        for(auto c:x){
            ans.push(c);
            if(ans.size()>k) ans.pop();
        }
        vector<string> res(k);
        for(int i = k-1;i>=0;i--){
            res[i]=ans.top().first;
            ans.pop();
        }
        return res;
    }
};

(2)Leettcode 703.数据流中的第K大元素 

        一开始一直想靠sort。。没用。。

        由于优先队列只能访问队头数组,所以我们要让数据流中的第K大元素是优先队列的队头,因此我们要保证优先队列中只有K个数,这K个数中的最小的数就一定是第K大的数,也是优先队列的队头。

class KthLargest {
public:
    priority_queue<int,vector<int>,greater<int>> x;
    int k;
    KthLargest(int k, vector<int>& nums) {
        this->k = k;
        for(auto c:nums){
            x.push(c);
            if(x.size()>k) x.pop();
        }
    }
    
    int add(int val) {
        x.push(val);
        if(x.size()>k) x.pop();
        return x.top();
    }
};

(3) Leetcode 264.丑数II

        

        没做出来。。

        假如一个数为丑数,那么这个数的两倍,三倍和五倍对应的数也是丑数,当然这么做肯定会有重复,因此我们用一个哈希集合来存储出现过的数,这样保证小根堆里面不出现重复的数,因此第k次取出来的数就是第k个丑数。

class Solution {
public:
    long nthUglyNumber(int n) {
        priority_queue<long,vector<long>,greater<long>> x;
        unordered_set<int> y;
        x.push(1);
        y.insert(1);
        for(int i = 0;i<n-1;i++){
            long k = x.top();
            x.pop();
            if(!y.count(k*2)){
                x.push(k*2);
                y.insert(k*2);
            }
            if(!y.count(k*3)){
                x.push(k*3);
                y.insert(k*3);
            }
            if(!y.count(k*5)){
                x.push(k*5);
                y.insert(k*5);
            }
        }
        return x.top();
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10. UE5 RPG使用GameEffect创建血瓶修改角色属性

前面我们通过代码实现了UI显示角色的血量和蓝量&#xff0c;并实现了初始化和在数值变动时实时更新。为了测试方便&#xff0c;没有使用GameEffect去修改角色的属性&#xff0c;而是通过代码直接修改的数值。 对于GameEffect的基础&#xff0c;这里不再讲解&#xff0c;如果需要…

跨境电商的网络为什么要用云桥通SDWAN企业组网?

传统的WAN连接通常由交换机和路由器构成&#xff0c;然而&#xff0c;随着企业内部网络的扩张和变革&#xff0c;传统WAN的管理和配置变得复杂繁琐。云桥通SDWAN组网采用了较新的技术方式&#xff0c;通过中央控制器对局域网设备进行管理和配置&#xff0c;从而实现了更为灵活、…

Java工程师的你,真的不想了解一下《类文件结构》吗?

身为Java工程师的你&#xff0c;真的不想了解一下《类文件结构》吗&#xff1f; 文章目录 身为Java工程师的你&#xff0c;真的不想了解一下《类文件结构》吗&#xff1f;回顾一下字节码Class 文件结构总结魔数&#xff08;Magic Number&#xff09;Class 文件版本号&#xff0…

彩虹PLM系统 产品数据管理解决方案

彩虹PLM系统 产品数据管理解决方案 当企业面临以下问题时&#xff0c;可能需要考虑引入 彩虹PLM系统&#xff1a; 随着市场竞争的日益激烈&#xff0c;企业需要不断提高自身的竞争优势和生产效率。然而&#xff0c;许多企业在产品研发、生产和管理方面仍然面临着诸多挑战。 例…

应急响应-Windows-进程排查

进程&#xff08;process&#xff09;是计算机中的程序关于某数据集合上的一次运动活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结果的基础。在早期面向进程结构中&#xff0c;进程是线程的容器。无论是在Windows系统还是Linux系统中&#xff0c…

探索二手旧物回收小程序:环保与经济的完美结合

随着社会的进步和人们生活水平的提高&#xff0c;消费观念也在不断变化。然而&#xff0c;在追求时尚和品质的同时&#xff0c;我们也面临着资源浪费和环境污染的问题。为了解决这些问题&#xff0c;二手旧物回收小程序应运而生。 一、二手旧物回收小程序的背景和意义 随着消…

小程序 样式 WXSS

文章目录 样式 WXSS尺⼨单位样式导⼊选择器⼩程序中使⽤less 样式 WXSS WXSS( WeiXin Style Sheets )是⼀套样式语⾔&#xff0c;⽤于描述 WXML 的组件样式。 与 CSS 相⽐&#xff0c;WXSS 扩展的特性有&#xff1a; 响应式⻓度单位 rpx样式导⼊ 尺⼨单位 rpx &#xff08;…

滴滴基于 Ray 的 XGBoost 大规模分布式训练实践

背景介绍 作为机器学习模型的核心代表&#xff0c;XGBoost 在滴滴众多策略算法业务场景中发挥着至关重要的作用。因此&#xff0c;保障并持续提升 XGBoost 模型的离线训练及在线推理稳定性一直是机器学习平台的重点工作。同时&#xff0c;面对多样化的业务场景定制需求和数据规…

Matlab图像增强学习笔记——imadjust函数的使用

1.引言 图像增强是数字图像处理领域中的一个重要主题&#xff0c;它涉及改进图像的对比度、亮度和色彩等方面&#xff0c;以使图像更适合于特定应用或更易于分析。Matlab 提供了丰富的图像处理工具&#xff0c;其中 imadjust 函数是一种强大的图像增强工具。本篇文章将深入学习…

年老返乡难,凭君传语报平安

惧于媒体谎言多&#xff0c;浏览社交媒体发布的国内外五花八门的时事新闻报道&#xff0c;踯躅良久&#xff0c;笔者放弃选择话题置评&#xff0c;只得履行本“人民体验官”义务&#xff0c;推广人民日报官方微博文化产品《你好&#xff0c;回家&#xff01;》&#xff0c;敷衍…

【Java网络编程03】网络原理进阶

【Java网络编程03】网络原理进阶 1. UDP协议 1.1 基本介绍 我们首先再来回顾UDP协议的基本特点&#xff1a; 无连接的不可靠传输的面向数据报的全双工的 既然谈到数据报&#xff0c;我们就来看一下UDP数据报的格式&#xff1a; UDP数据报分为报头和载荷部分&#xff0c;其…

臻于至善,CodeArts Snap 二维绘图来一套不?

前言 我在体验 华为云的 CodeArts Snap 时&#xff0c;第一个例子就是绘制三角函数图像&#xff0c;功能注释写的也很简单。 业务场景中&#xff0c;有一类就是需要产出各种二维图形的&#xff0c;比如&#xff0c;折线图、散点图、柱状图等。 为了提前积累业务素材&#xf…

AG32VF407 AGRV2K 串口printf调试输出

视频讲解 [AG32VF407]国产MCUFPGA 串口printf调试输出及演示 原理图 测试代码 新建一个platformio工程&#xff0c;复制如下文件到测试工程目录下 E:\tech\AGM-AG32VF\sdk-release\AgRV_pio\platforms\AgRV\boards\agrv2k_407\board.asf E:\tech\AGM-AG32VF\sdk-release\AgRV_…

WordPress反垃圾评论插件Akismet有什么用?如何使用Akismet插件?

每次我们成功搭建好WordPress网站后&#xff0c;都可以在后台 >> 插件 >> 已安装的插件&#xff0c;在插件列表中可以看到有一个“Akismet反垃圾邮件&#xff1a;垃圾邮件保护”的插件&#xff08;个人觉得是翻译错误&#xff0c;应该是反垃圾评论&#xff09;。具…

C/C++ 跨文件共享全局变量

目录 效果 项目 代码 下载 为了实现跨文件共享全局变量&#xff0c;我们可以使用 extern 关键字。extern 关键字用于声明一个变量&#xff0c;该变量在其他地方已经定义。它告诉编译器这个变量在其他文件中已经定义了&#xff0c;不需要重新分配内存空间&#xff0c;只需要…

大数据开发之Spark(完整版)

第 1 章&#xff1a;Spark概述 1.1 什么是spark 回顾&#xff1a;hadoop主要解决&#xff0c;海量数据的存储和海量数据的分析计算。 spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 1.2 hadoop与spark历史 hadoop的yarn框架比spark框架诞生的晚&#xff…

搭建Vite和Vue环境

​ 第一步&#xff1a;创建一个文件夹&#xff08;此处为新建文件夹&#xff09;&#xff0c;并通过vscode打开 第二步&#xff1a;鼠标右键新建终端&#xff0c;并在终端处输入代码npm create vuelatest ​第三步&#xff1a;输入该项目名称&#xff08;该项目名称并不是第一…

强制删除的文件还能恢复吗?答案分享!

“我在电脑上删除部分文件时总是显示无法删除&#xff0c;因此我把这部分文件强制删除了。这些文件还有机会恢复吗&#xff1f;怎样才能恢复这部分数据呢&#xff1f;希望大家帮我想想办法。” 部分用户在电脑上执行删除操作时&#xff0c;也可能会误删比较重要的数据。如果这部…

大模型学习与实践笔记(十三)

将训练好的模型权重上传到 OpenXLab 方式1&#xff1a; 先将Adapter 模型权重通过scp 传到本地&#xff0c;然后网页上传 步骤1. scp 到本地 命令为&#xff1a; scp -o StrictHostKeyCheckingno -r -P *** rootssh.intern-ai.org.cn:/root/data/ e/opencv/ 步骤2&#…

新加坡市场外贸开发攻略

新加坡&#xff0c;东南亚的一颗璀璨明珠&#xff0c;坐落于马来西亚半岛南端&#xff0c;与印度尼西亚的苏门答腊岛隔海相望。这个城市国家不仅拥有现代化的城市风貌&#xff0c;还融合了多元文化背景。 以下是对新加坡的国家介绍&#xff1a; 首都新加坡&#xff0c;是政治…