leetcode 3081

leetcode 3081

题目

在这里插入图片描述

例子

在这里插入图片描述

思路

使用minheap 记录字符出现频次

代码

class Solution {
public:
    string minimizeStringValue(string s) {
        int freq[26]{};
        for(char c: s){
            if(c != '?'){
                freq[c-'a']++;
            }
        }

        //std::greater<> 比较器比较 pair 对象时,默认比较规则是先比较第一个元素
        priority_queue<pair<int, char>, vector<pair<int, char>>, greater<>> minheap;

        for(int i=0; i<26; i++){
            minheap.push({freq[i], 'a'+i});
        }

        int q = ranges::count(s, '?');
        string tmp(q,0);
        for(int i =0; i<q; i++){
            auto [f,c] = minheap.top();
            minheap.pop();
            tmp[i] = c;
            // c代替了'?', 更新minheap
            minheap.push({f+1,c});
        }

        for(int i=0, j=0; i<s.size(); i++){
            if(s[i] == '?'){
                s[i] = tmp[j];
                j++;
            }
        }

        return s;
    }
};

在这里插入图片描述

分析

在这里插入图片描述

priority_queue

要使用 pair 类型的 priority_queue 声明最小堆,可以通过指定自定义的比较器来实现。在比较器中,我们需要定义如何比较两个 pair 对象,以确保最小的元素在队首。

以下是一个示例代码,演示如何声明一个 pair 类型的 priority_queue,并使用自定义比较器来实现最小堆:

#include <iostream>
#include <queue>
#include <utility>

// 自定义比较器,用于实现最小堆
struct ComparePairs {
    bool operator() (const std::pair<int, int>& p1, const std::pair<int, int>& p2) {
        return p1.first > p2.first; // 按照 pair 的第一个元素升序排序
    }
};

int main() {
    std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, ComparePairs> minHeap;

    minHeap.push({3, 1});
    minHeap.push({1, 2});
    minHeap.push({5, 3});
    minHeap.push({2, 4});

    std::cout << "Min Heap elements: ";
    while (!minHeap.empty()) {
        std::pair<int, int> topPair = minHeap.top();
        std::cout << "(" << topPair.first << ", " << topPair.second << ") ";
        minHeap.pop();
    }

    return 0;
}

在上面的代码中,我们首先定义了一个自定义的比较器 ComparePairs,用于比较两个 pair 对象。在比较器中,我们按照 pair 的第一个元素来进行升序排序,以实现最小堆。

然后,我们声明了一个 pair<int, int> 类型的 priority_queue,并指定了底层容器为 vector<pair<int, int>> 和比较器为 ComparePairs,从而创建了一个最小堆。

接着,我们向最小堆中插入一些 pair 对象,并通过 top 和 pop 方法访问和删除堆顶元素,最终打印出堆中的元素。

在上面的示例代码中,定义了一个自定义的比较器 ComparePairs,其中重载了函数调用运算符 operator()。在使用 priority_queue 时,当需要比较两个元素的大小以确定它们在堆中的顺序时,会调用这个比较器中重载的 operator() 函数。

在这个例子中,ComparePairs 结构体中的 operator() 函数定义了如何比较两个 pair<int, int> 对象。具体来说,我们在函数中比较了两个 pair 对象的第一个元素,以确保最小的元素在队首。这个比较逻辑决定了在 priority_queue 中元素的排序顺序。

当创建 priority_queue 对象时,通过指定自定义的比较器 ComparePairspriority_queue 在需要比较两个元素时会调用该比较器中的 operator() 函数。这样就确保了在插入、弹出或访问元素时,元素会按照我们定义的比较逻辑进行排序。

greater

std::greater<> 是一个函数对象,用于实现严格的降序排序。它定义在 <functional> 头文件中,并可以用作比较器,用于比较两个元素并确定它们的顺序。

当使用 std::greater<> 作为比较器时,它会按照严格的降序排列元素,即较大的元素会排在前面。这在实现最小堆的 priority_queue 中非常有用,因为最小堆要求堆顶元素是最小的。

std::greater<> 是一个模板类,可以根据需要指定元素的类型。例如,std::greater<int> 用于比较整数类型的元素,std::greater<double> 用于比较双精度浮点数类型的元素。

在使用 std::greater<> 时,通常会将其作为模板参数传递给容器或算法,以指定降序排序的方式。除了在 priority_queue 中使用外,std::greater<> 还可以在 std::sort 等算法中用作比较器来实现降序排序。

std::greater<> 是一个非常方便的函数对象,用于实现降序排序。通过使用它,我们可以轻松地按照降序排列元素,而无需自定义比较器。

除了 greater 之外,C++ 标准库中还提供了其他一些类似的函数对象,用于比较元素大小或实现自定义的比较逻辑。一些常用的函数对象包括:

  1. less:用于升序排序,类似于 std::less<T>,在 priority_queue 中可以用于实现最小堆。
  2. greater_equal:用于大于等于比较,类似于 std::greater_equal<T>,可以用于实现最大堆。
  3. less_equal:用于小于等于比较,类似于 std::less_equal<T>,可以用于实现最小堆。
  4. not_equal_to:用于不等于比较,类似于 std::not_equal_to<T>,可以用于实现特定的排序逻辑。

这些函数对象都定义在 <functional> 头文件中,并且可以在 priority_queue 的声明中作为比较器来使用,以实现不同的排序方式。

除了标准库提供的函数对象外,您也可以自定义比较器,通过重载函数调用运算符 operator() 来实现特定的比较逻辑,从而创建最大堆、最小堆或其他自定义的排序方式。

希望这个回答能够帮助您了解除了 greater 外还有哪些类似的函数对象。如果您有任何其他问题或需要进一步解释,请随时告诉我。我随时准备帮助您。

最小堆和最大堆

最大堆(Max Heap)和最小堆(Min Heap)是堆(Heap)数据结构的两种常见形式,它们都是完全二叉树,并且具有一些特定的性质:

  1. 最大堆(Max Heap):

    • 在最大堆中,对于任意节点 i,其父节点的值大于等于节点 i 的值。
    • 最大堆中的根节点(堆顶元素)始终是整个堆中的最大元素。
    • 最大堆通常用于实现优先队列,以便在常数时间内获取和删除最大元素。
  2. 最小堆(Min Heap):

    • 在最小堆中,对于任意节点 i,其父节点的值小于等于节点 i 的值。
    • 最小堆中的根节点(堆顶元素)始终是整个堆中的最小元素。
    • 最小堆通常用于实现优先队列,以便在常数时间内获取和删除最小元素。

堆的插入和删除操作会保持堆的性质不变,即插入元素时会保持堆的有序性,删除元素时会重新调整堆以满足堆的性质。

在 C++ 中,可以使用 std::priority_queue 来实现堆,通过指定合适的比较器(如 std::lessstd::greater)可以实现最小堆或最大堆。堆的操作时间复杂度为 O(log n),其中 n 是堆中元素的数量。

总结来说,最大堆和最小堆都是一种特殊的二叉树结构,用于高效地维护一组元素中的最大值或最小值。它们在算法和数据结构中有着广泛的应用,例如在排序算法、图算法和优先队列等领域。希望这个简要介绍对您有帮助。如果您有任何进一步的问题,请随时告诉我。我很乐意帮助您。

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

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

相关文章

Python数学建模-2.8SymPy库

SymPy库是一个强大的符号计算库&#xff0c;它为Python提供了符号数学计算的能力&#xff0c;它提供了大量的数学符号操作的函数和类&#xff0c;可以帮助用户进行各种复杂的数学计算&#xff0c;如代数、微积分、离散数学、量子力学等。与NumPy等库主要关注数值计算不同&#…

GAMES101 学习3

Lecture 13 ~ 16 Shadow mapping 一种图像空间算法生成阴影时不需要知道场景中的几何信息会产生走样现象 最重要的思想&#xff1a;如果有的点不在阴影里你又能看到这个点&#xff0c;那么说明摄像机可以看到这个点&#xff0c;光源也可以看到这个点 经典的Shadow mapping …

【管理咨询宝藏54】资产管理公司战略规划报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏54】资产管理公司战略规划报告 【格式】PPT&#xff0c;可自由编辑 【关键词】战略规划、商业分析、管理咨询 【核心观点】 - 随着本地和国外资…

最新Java面试题3【2024初级】

下载链接&#xff1a;博主已将以上这些面试题整理成了一个面试手册&#xff0c;是PDF版的 互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字…

计算机毕业设计-基于python的旅游信息爬取以及数据分析

概要 随着计算机网络技术的发展&#xff0c;近年来&#xff0c;新的编程语言层出不穷&#xff0c;python语言就是近些年来最为火爆的一门语言&#xff0c;python语言&#xff0c;相对于其他高级语言而言&#xff0c;python有着更加便捷实用的模块以及库&#xff0c;具有语法简单…

diffusion model(十四): prompt-to-prompt 深度剖析

infopaperPrompt-to-Prompt Image Editing with Cross Attention Controlgithubhttps://github.com/google/prompt-to-promptOrg:Google Research个人复现https://github.com/myhz0606/diffusion_learning个人博客主页http://myhz0606.com/article/p2p 1 前言 基于扩散模型&a…

LightGBM:更好更快地用于工业实践集成学习算法

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

教务管理系统(java+mysql+jdbc+Druid+三层架构)

1、项目要求 1.1数据库表描述 设计一个教务管理系统&#xff0c;要求如下&#xff1a; 系统涉及的表有 account表&#xff08;账号表&#xff09; teacher表&#xff08;教师表&#xff09; student表&#xff08;学生表&#xff09; course表 (课程表) score表&#xff08;成…

2022年安徽省职业院校技能大赛 (高职组)“云计算”赛项样卷

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 第一场次&#xff1a;私有云(5…

Redis高阶使用消息队列分布式锁排行榜等

一、前言 在大多数传统的web系统中&#xff0c;使用Redis一般都是作为缓存使用&#xff0c;在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用Redis也主要使用到缓存的作用&#xff0c;还有做了注册中心&#xff0c;分布式事务。其他的强大的功能&#xff0c;没有…

【HMM】Hidden Markov Model

文章目录 1 HMM 的概念1.1 引入1.1.1 Markov property1.1.2 Markov chain1.1.3 一阶离散马尔可夫模型 1.2 HMM 的定义1.3 观测序列的生成过程1.4 HMM 的 3 个基本问题 2 三个基本问题的解法2.1 概率计算算法2.1.1 直接计算法2.1.2 向前算法2.1.3 向后算法2.1.4 一些概率与期望值…

localhost与127.0.0.1的区别 竟然还有人不知道?

localhost和127.0.0.1有什么区别&#xff1f;   很多用户都有接触过回送地址127.0.0.1用来测试一些数据&#xff0c;localhost在严格意义上来说是一个本地的服务器&#xff0c;编程用户或许更了解localhost的存在意义。   大多数使用localhost的编程工作者&#xff0c;实际…

java.lang.NoSuchFieldError: ASSIGN_ID

一、写在前面 很多时候我们都会遇到这个异常&#xff0c;我的场景是与mybatis有关&#xff0c;若看客不是此类情形&#xff0c;仅做参考即可。 二、异常提示 Caused by: java.lang.NoSuchFieldError: ASSIGN_IDat com.baomidou.mybatisplus.core.config.GlobalConfig$DbConf…

基于cifar-10的图像分类

一、 背景 CIFAR-10 数据集由 10 类中的 60000 张 32x32 彩色图像组成&#xff0c;每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。数据集分为五个训练批次和一个测试批次&#xff0c;每个批次有 10000 张图像。测试批次包含来自每个类的 1000 个随机选择的图像。…

国创证券|新手建议不要买哪些股票?新手股票避雷!

出资者在进行股票生意之前&#xff0c;对股票的选择也是一种很重要的环节&#xff0c;特别是对于新手出资者来说&#xff0c;很简单踩雷。那么新手主张不要买哪些股票&#xff1f;下面就由国创证券为我们分析&#xff1a; 新手主张不要买哪些股票&#xff1f; 1、业绩差的股票…

[LeetCode][LCR170]交易逆序对的总数

题目 LCR 170. 交易逆序对的总数 在股票交易中&#xff0c;如果前一天的股价高于后一天的股价&#xff0c;则可以认为存在一个「交易逆序对」。请设计一个程序&#xff0c;输入一段时间内的股票交易记录 record&#xff0c;返回其中存在的「交易逆序对」总数。 示例 1&#xf…

ABAQUS应用05——将开发好的Python封装起来供后续开发调用

闲话不多说&#xff0c;把写好的py文档放置在这里调用即可。 放置进来以后&#xff0c;会自动形成同名的pyc文件。有意思的是&#xff0c;此时将py文件和pyc文件删掉都不会影响建模&#xff0c;但是关掉ABAQUS再打开就会找不到。不过我想如果保留pyc文件的话应该不成问题。当…

AI - 机器学习GBDT算法

目录 GBDT 提升树 梯度提升树 GBDT算法实战案例 XGBoost &#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; GBDT 梯度提升决策树&#xff08;Gradient Boosting Decision Tree&#xff09;&#xff0c;是一种集成学习的算法&…

web前端之多种方式实现switch滑块功能、动态设置css变量、after伪元素、选择器、has伪类

MENU 效果图htmlcsshtmlcssJS 效果图 htmlcss html <div class"s"><input type"checkbox" id"si" class"si"><label for"si" class"sl"></label> </div>style * {margin: 0;pad…

vue-admin-template极简的 vue admin 管理后台的动态路由实现方法

项目源码地址&#xff1a;GitHub - PanJiaChen/vue-admin-template: a vue2.0 minimal admin template 注意&#xff1a;项目中的路由均写在 src\router\index.js 中&#xff0c;其中默认包含 constantRoutes 数组&#xff0c;这是固定路由&#xff0c;无论用户是什么角色&…