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

news2024/12/28 20:24:39

例题:(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();
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧应急消防柜的作用

在现代社会&#xff0c;科技的不断进步带来了许多便利与改变。智能化的产品不仅给我们的生活带来了便捷&#xff0c;也让我们对各个领域的发展有了更高的期待。而在这种场景下&#xff0c;智慧应急消防柜作为智慧城市新型基础设施的必备品&#xff0c;正逐渐受到更多关注。 智能…

利用ADS建立MIPI D-PHY链路仿真流程

根据MIPI D-PHY v1.2规范中对于互连电气参数的定义,本次仿真实例中,需要重点关注如下的设计参数: 1. 差分信号的插入损耗Sddij和回拨损耗Sddii; 2. 模式转换损耗Sdcxx、Scdxx; 3. 数据线与时钟线之间的串扰耦合(远、近端)。 设计者还可以结合CTS中的补充…

抓包工具fiddler看完你就懂了

一、简介 fiddler是位于客户端和服务端之间的http代理 1、作用 监控浏览器所有的http/https流量查看、分析请求内容细节伪造客户端请求和服务器请求测试网站的性能解密https的web会话全局、局部断电功能第三方插件 2、使用场景 接口调试、接口测试、线上环境调试、web性能分…

驱动开发-系统移植

一、Linux系统移植概念 需要移植三部分东西&#xff0c;Uboot ,内核 &#xff0c;根文件系统 &#xff08;rootfs&#xff09; &#xff0c;这三个构成了一个完整的Linux系统。 把这三部分学明白&#xff0c;系统移植就懂点了。 二、Uboot uboot就是引导程序下载的一段代…

爬取樱花动漫名侦探柯南最新剧场版ts格式

import os import requests import zipfile from tqdm import tqdm import tkinter as tkfilename 名侦探柯南\\ if not os.path.exists(filename):os.mkdir(filename) # https://vip.ffzy-online6.com/20231129/22304_740e70d0/2000k/hls/cedd2dc1ecb000001.ts # https://vip…

开源无代码应用程序生成器Saltcorn

什么是 Saltcorn &#xff1f; Saltcorn 是一个无需编写任何代码即可构建数据库 Web 应用程序的平台。它配备了一个吸睛的仪表板&#xff0c;丰富的生态系统、视图生成器以及支持主题的界面&#xff0c;使用直观的点击、拖放用户界面来构建整个应用程序。 软件的特点&#xff1…

【漏洞复现】艺创科技智能营销路由器后台命令执行漏洞

Nx01 产品简介 成都艺创科技有限公司&#xff0c;成立于2011年&#xff0c;位于四川省成都市&#xff0c;是一家以从事研究和试验发展为主的企业。企业注册资本1000万人民币&#xff0c;实缴资本50万人民币。 Nx02 漏洞描述 成都艺创科技有限公司智能营销路由器存在默认口令(…

QT+VS实现Kmeans聚类算法

1、Kmeans的定义 聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程&#xff0c;聚类就是一种发现这种内在结构的技术&#xff0c;聚类技术经常被称为无监督学习。k均值聚类是最著名的划分聚类算法&#xff0c;由于简洁和效率使得他成为所有聚类算法中最广泛使…

数位dp,HDU 4151 The Special Number

一、题目 1、题目描述 In this problem, we assume the positive integer with the following properties are called ‘the special number’: 1) The special number is a non-negative integer without any leading zero. 2) The numbers in every digit of the special nu…

RCE 漏洞审计

Command Injection 命令注入&#xff08;Command Injection&#xff09;是一种安全漏洞&#xff0c;命令注入攻击的目的是&#xff0c;在易受攻击的应用程序中注入和执行攻击者指定的命令。在这种情况下&#xff0c;执行不需要的系统命令的应用程序就像一个伪系统外壳&#xff…

无线监测终端引领文物保护和管理新篇章

一、文物预防性保护系统大升级 随着科技的不断发展&#xff0c;越来越多的高科技产品进入人们的生活和工作中。在文物保护和管理行业&#xff0c;无线监测终端大放异彩。免布线、即插即用的特点在提供方便的同时&#xff0c;也为文物的长久保存和有效管理带来更好的保护环境。…

兼容树莓派扩展模块,专注工业产品开发的瑞米派强势来袭

近日&#xff0c;米尔电子和瑞萨电子共同定义和开发了瑞萨第一款MPU生态开发板——瑞米派&#xff08;Remi Pi&#xff09;正式上市了&#xff01;在各种Pi板卡琳琅满目的当下&#xff0c;Remi Pi是一款与众不同的开发板&#xff0c;他兼顾了严肃产品开发和爱好者创意实现两种需…

ffmpeg和opencv一些容易影响图片清晰度的操作

ffmpeg 转视频或者图片&#xff0c;不指定码率清晰度会下降 ffmpeg -i xxx.png xxx.mp4 码率也叫比特率&#xff08;Bit rate&#xff09;(也叫数据率)是一个确定整体视频/音频质量的参数&#xff0c;秒为单位处理的字节数&#xff0c;码率和视频质量成正比&#xff0c;在视频…

Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

Java七大排序详解

排序 排序的概念 所谓排序 &#xff0c;就是让一串记录&#xff0c;按照其中某些或者某个关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;就比如在待排序的序列中&#xff0c;存在多个具有相同关键字的记录 &#xff0c;如果经过排序这些相同的关键…

通过FileZilla配置FTP

FileZilla服务端的安装 在虚拟机里安装FileZilla服务器 FileZilla的官网 下载一个客户端和一个服务端的FileZilla 如果已经有了一个客户端&#xff0c;可以不下用载。 FileZilla的配置 说明一下&#xff1a;通过FileZilla配置FTP有两种模式&#xff0c;我们先用被动模式 下载…

Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析

2.3.3 集成 阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了&#xff0c;接下来我们就需要在案例当中集成oss对象存储服务&#xff0c;来存储和管理案例中上传的图片。 在新增员工的时候&#xff0c;上传员工的图像&#xff0c;而之所以需要上传员工的图像&…

CDR绘图软件|安装教程来了(小白福利:有红包封面领取哦!)

前言 今天给小伙伴们讲讲&#xff1a;如何安装CDR软件。 如果未来的你想从事平面设计/广告行业&#xff0c;那应该就会接触到CDR这款软件。 CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件&#xff1b;该软件是Corel公司出品的矢量图形制作工具软件&#xff0c;这…

GPT应用程序的限制

尽管GPT&#xff08;Generative Pre-trained Transformer&#xff09;应用程序具有强大的自然语言生成能力&#xff0c;但也存在一些限制和挑战。以下是一些常见的GPT应用程序的限制&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公…

HCIA-HarmonyOS设备开发认证-2.设备开发入门

目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍 待续... HarmonyOS设备开发学习路径 一、开发项目与工具介绍 1.1、设备开发环境准备 Window、…