数据结构笔记--优先队列(大小根堆)经典题型

news2024/11/26 5:15:35

1--项目的最大利润

题目描述:

        输入:正数数组 costs,costs[i] 表示项目 i 的花费;正数数组 profits,profits[i] 表示项目 i 的花费;正数 k 表示只能串行完成最多 k 个项目;m 表示拥有的资金,每完成一个项目后资金会立即更新(原始资金 + 利润);

        输出:求解最后获得的最大利润;

主要思路:

        小根堆存储所有项目,大根堆存储可以进行的项目;

        每次从小根堆解锁项目添加到大根堆中,优先做大根堆利润最高的项目;

#include <iostream>
#include <vector>
#include <queue>

struct project{
    project(int c, int p) : cost(c), profit(p) {}
    int cost;
    int profit;
};

class cmp1{
public:
    bool operator()(project* a, project* b){
        return a->cost > b->cost;
    }
};

struct cmp2{
    bool operator()(project* a, project* b){
        return a->profit < b->profit;
    }
};

class Solution{
public:
    int findMaxCapital(int m, int k, std::vector<int> costs, std::vector<int> profits){
        std::priority_queue<project*, std::vector<project*>, cmp1> minCostQ;
        std::priority_queue<project*, std::vector<project*>, cmp2> maxProfitQ;

        // 按cost按从小到大排序项目
        for(int i = 0; i < profits.size(); i++){
            minCostQ.push(new project(costs[i], profits[i]));
        }
        for(int i = 0; i < k; i++){
            while(!minCostQ.empty() && minCostQ.top()->cost <= m){
                // 可以解锁新的项目
                maxProfitQ.push(minCostQ.top());
                minCostQ.pop();
            }
            if(maxProfitQ.empty()) return m; // 无法解锁新的项目,直接返回
            
            // 更新资金
            m += maxProfitQ.top()->profit;
            maxProfitQ.pop();
        }
        return m;
    }
};

int main(int argc, char *argv[]){
    int m = 1;
    int k = 2;
    std::vector<int> costs = {1, 1, 2, 2, 3, 4};
    std::vector<int> profits = {1, 4, 3, 7, 2, 10};
    Solution S1;
    int res = S1.findMaxCapital(m, k, costs, profits);
    std::cout << res << std::endl; 
}

2--数据流的中位数

主要思路:

        分别使用大根堆和小根堆存储数据,每添加一个数据,先将数据添加至大根堆,再将数据弹出并添加到小根堆;

        当小根堆值的数量与大根堆值的数量相差 2 时,从小根堆弹出数据添加到大根堆中,保持两个根堆的容量差不超过;

        根据添加数据量是偶数还是奇数,返回对应的中位数;

#include <iostream>
#include <queue>

class MedianFinder {
public:
    MedianFinder() {

    }
    
    void addNum(int num) {
        maxQ.push(num);
        minQ.push(maxQ.top());
        maxQ.pop();
        if(minQ.size() - maxQ.size() > 1){
            maxQ.push(minQ.top());
            minQ.pop();
        }
    }
    
    double findMedian() {
        // 奇数
        if((maxQ.size() + minQ.size()) % 2 != 0) return minQ.top();
        // 偶数
        else return( (maxQ.top() + minQ.top()) / 2.0);
    }
private:
    std::priority_queue<int, std::vector<int>, std::greater<int>> minQ;
    std::priority_queue<int, std::vector<int>, std::less<int>> maxQ;
};

int main(int argc, char *argv[]){
    MedianFinder S1;
    S1.addNum(1);
    S1.addNum(2);
    S1.addNum(3);
    S1.addNum(4);
    S1.addNum(5);
    double res = S1.findMedian();
    std::cout << res << std::endl;
}

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

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

相关文章

应急响应-钓鱼邮件的处理思路溯源及其反制

0x00 钓鱼邮件的危害 1.窃取用户敏感信息&#xff0c;制作虚假网址&#xff0c;诱导用户输入敏感的账户信息后记录 2.携带病毒木马程序&#xff0c;诱导安装&#xff0c;使电脑中病毒木马等 3.挖矿病毒的传输&#xff0c;勒索病毒的传输等等 0x01 有指纹的钓鱼邮件的溯源处理…

非计算机专业的能当程序员吗?

非计算机专业的能当程序员吗? &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1f604; …

React源码解析18(6)------ 实现useState

摘要 在上一篇文章中&#xff0c;我们已经实现了函数组件。同时可以正常通过render进行渲染。 而通过之前的文章&#xff0c;beginWork和completeWork也已经有了基本的架子。现在我们可以去实现useState了。 实现之前&#xff0c;我们要先修改一下我们的index.js文件&#x…

Redis数据结构——链表list

链表是一种常用的数据结构&#xff0c;提供了顺序访问的方式&#xff0c;而且高效地增删操作。 Redis中广泛使用了链表&#xff0c;例如&#xff1a;列表的底层实现之一就是链表。 在Redis中&#xff0c;链表分为两部分&#xff1a;链表信息 链表节点。 链表节点用来表示链表…

Leetcode-每日一题【剑指 Offer 30. 包含min函数的栈】

题目 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中&#xff0c;调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例: MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack…

1+X Web前端开发职业技能等级证书建设方案

一 、系统概述 1X Web前端开发技术是计算机类专业重要的核心课程&#xff0c;课程所包含的教学内容多&#xff0c;实践性强&#xff0c;并且相关技术更新快。传统的课堂讲授模式以教师为中心&#xff0c;学生被动式接收&#xff0c;难以调动学生学习的积极性和主动性。混合式教…

C语言指针笔试真题整理(8道)

前言 本篇文章整理了一些指针的笔试题&#xff0c;适合初学者以及对于指针掌握并不是很牢固的朋友阅读&#xff0c;当然&#xff0c;大佬想做着玩的话可以看一看第八题~ 分类&#xff1a;循序渐进的难度&#xff1a;前三题和第七题是简单题&#xff0c;第四题有陷阱&#xff…

什么是Web应用程序防火墙,WAF与其他网络安全工具差异在哪?

一、什么是Web 应用程序防火墙 (WAF) &#xff1f; WAF软件产品被广泛应用于保护Web应用程序和网站免受威胁或攻击&#xff0c;它通过监控用户、应用程序和其他互联网来源之间的流量&#xff0c;有效防御跨站点伪造、跨站点脚本&#xff08;XSS攻击&#xff09;、SQL注入、DDo…

最新版本 Stable Diffusion 开源 AI 绘画工具之 VAE 篇

✨ 目录 &#x1f388; 什么是VAE&#x1f388; 开启VAE&#x1f388; 下载常见的VAE&#x1f388; 对比不同VAE生成的效果 &#x1f388; 什么是VAE VAE&#xff1a;是 Variational Auto-Encoder 的简称&#xff0c;也就是变分自动编码器可以把它理解成给图片加滤镜&#xff…

ChatGPT or BingChat

你相信我们对大模型也存在「迷信权威」吗&#xff1f; ChatGPT 的 GPT-4 名声在外&#xff0c;我们就不自觉地更相信它&#xff0c;优先使用它。但我用 ChatALL 比较 AI 大模型们这么久&#xff0c;得到的结论是&#xff1a; ChatGPT GPT-4 在大多数情况下确实是最强&#xf…

【elementUi】绘制自定义表格、绘制曲线表格

要求绘制下图系列表格&#xff1a; 实现步骤: 1.绘制树&#xff0c;实现树勾选字段—>表格绘制字段 逻辑&#xff1a; 树&#xff1a;check-change“treeChart.handleCheckChange” 绑定点击选择事件&#xff0c;改变data.column3数据项&#xff1b;表格:columns"data…

Unity智慧园区夜景制作

近期使用Unity做了一个智慧园区场景的demo&#xff0c;初步了解了3D开发的一些步骤和知识&#xff0c;以下为制作的步骤&#xff0c;比较简略&#xff0c;备忘&#xff1a; 1. 制作前的设计分析&#xff1a; 1. 分析日光角度&#xff0c;阴影长度&#xff0c;效果 2. 分析冷暖…

Idea 快捷键整理

Idea快捷键和自动代码补全汇总 idea快捷键汇总 Ctrl 快捷键说明Ctrl F在当前文件进行文本查找 &#xff08;必备&#xff09;Ctrl R在当前文件进行文本替换 &#xff08;必备&#xff09;Ctrl Z撤销 &#xff08;必备&#xff09;Ctrl Y删除光标所在行 或 删除选中的行 &am…

双向最佳路径优先搜索算法

概念 双向最佳优先搜索&#xff08;Bidirectional Best-First Search&#xff09;是一种图搜索算法&#xff0c;用于在给定的图或树中找到两个节点之间的最短路径。该算法尝试从起始节点和目标节点同时扩展搜索&#xff0c;直到两个搜索方向相遇。 双向最佳优先搜索的步骤如下…

Rx.NET in Action 第三章学习笔记

3 C#函数式编程思想 本章内容包括 将 C# 与函数式技术相结合使用委托和 lambda 表达式使用 LINQ 查询集合 面向对象编程为程序开发提供了巨大的生产力。它将复杂的系统分解为类&#xff0c;使项目更易于管理&#xff0c;而对象则是一个个孤岛&#xff0c;你可以集中精力分别处理…

table 根据窗口缩放,自适应

element-plus中&#xff0c;直接应用在页面样式上&#xff0c; ::v-deep .el-table{width: 100%; } ::v-deep .el-table__header-wrapper table,::v-deep .el-table__body-wrapper table{width: 100% !important; } ::v-deep .el-table__body,::v-deep .el-table__footer,::v-d…

试卷转电子版怎样处理?分享个好用的扫描转换方法

试卷转电子版是一个常见的需求&#xff0c;可以通过扫描纸质试卷来实现。但是&#xff0c;扫描后的文件可能会有一些问题&#xff0c;例如模糊、颜色失真、文字识别错误等。在这篇文章中&#xff0c;我将分享一个好用的扫描转换方法&#xff0c;可以帮助您快速而准确地将试卷转…

Spring 中 @Qualifier 注解还能这么用?

文章目录 1. 基本用法1.1 指定 Bean 名称1.2 不指定 Bean 名称1.3 自定义注解1.4 XML 中的配置 2. 源码分析2.1 doResolveDependency2.2 findAutowireCandidates 3. 小结 今天想和小伙伴们聊一聊 Qualifier 注解的完整用法&#xff0c;同时也顺便分析一下它的实现原理。 说到 Q…

【运维知识高级篇】超详细的Jenkins教程1(安装部署+配置插件+创建自由风格项目+配合gitlab实现Jenkins自动触发)

Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成的工具&#xff0c;用于监控持续重复的工作&#xff0c; 旨在提供一个开放易用的平台&#xff0c;使软件的持续集成变成可能&#xff0c;是持续集成的核心&#xff0c;可以与其他软件进行协作&#xff0c;例…

为什么骑友对太过商业化的景点如此反感?

一骑友小李最近在社交媒体上分享了他的旅行经历。他去了一个著名的景点&#xff0c;原本期待满满&#xff0c;却发现这个曾经心中的旅行圣地已经变得过分商业化。小卖部、纪念品摊位、过度开发的风景……让他感到十分失望。他的故事引发了骑友们的热议&#xff0c;很多人表示深…