leetcode 3081

news2024/9/22 7:27:45

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 是堆中元素的数量。

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

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

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

相关文章

leetcode刷题(javaScript)——动态规划相关场景题总结

动态规划在 JavaScript 刷题中有一定的难度&#xff0c;但也是非常常见和重要的算法思想。动态规划通常适用于需要求解最优解、最大值、最小值等问题的场景&#xff0c;可以将复杂问题拆分成子问题&#xff0c;通过存储子问题的解来避免重复计算&#xff0c;从而提高效率。 理解…

elk收集k8s微服务日志

一、前言 使用filebeat自动发现收集k8s的pod日志&#xff0c;这里分别收集前端的nginx日志&#xff0c;还有后端的服务java日志&#xff0c;所有格式都是用json格式&#xff0c;建议还是需要让开发人员去输出java的日志为json&#xff0c;logstash分割java日志为json格式&#…

Transformer的前世今生 day01(预训练、统计语言模型)

预训练 在相似任务中&#xff0c;由于神经网络模型的浅层是通用的&#xff0c;如下图&#xff1a; 所以当我们的数据集不够大&#xff0c;不能产生性能良好的模型时&#xff0c;可以尝试让模型B在用模型A的浅层基础上&#xff0c;深层的部分自己生成参数&#xff0c;减小数据集…

京津冀自动驾驶产业盛会“2024北京国际自动驾驶技术展览会”

随着科技的飞速发展&#xff0c;自动驾驶技术成为了汽车产业变革的热点和前沿。智能化、网联化已经成为推动汽车产业创新发展的重要力量&#xff0c;而自动驾驶技术则是其中的关键一环。它不仅能够提高道路安全性、缓解交通拥堵&#xff0c;还能为乘客带来更加舒适、便捷的出行…

注册个人小程序

访问地址 https://mp.weixin.qq.com/ 立即注册 选择小程序 注册 填写信息 登录邮箱 访问邮箱的链接激活账号 选择个人&#xff0c;填写信息 注册完成&#xff0c;即可登录进入填写信息

苍穹外卖-day15:套餐管理

套餐管理 课程内容 套餐分页查询启售停售套餐删除套餐新增套餐 1. 套餐分页查询 1.1 需求分析和接口设计 根据产品原型来了解需求&#xff0c;套餐分页查询的产品原型如下&#xff1a; 业务规则&#xff1a; 根据页码展示套餐信息(套餐名称、套餐图片、套餐分类、价格、售…

qt+ffmpeg 实现音视频播放(二)之音频播放

一、音频播放流程 1、打开音频文件 通过 avformat_open_input() 打开媒体文件并分配和初始化 AVFormatContext 结构体。 函数原型如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说…

数据分析-Pandas的Andrews曲线可视化解读

数据分析-Pandas的Andrews曲线可视化解读 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据…

C#,图论与图算法,无向图(Graph)回环(Cycle)的不相交集(disjoint)或并集查找(union find)判别算法与源代码

1 回环(Cycle)的不相交集(disjoint)或并集 不相交集数据结构是一种数据结构,它跟踪划分为多个不相交(非重叠)子集的一组元素。联合查找算法是对此类数据结构执行两个有用操作的算法: 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一子集中。 并集:将…

Django中使用celery实现异步任务、延时任务、周期定时任务

配置celery 1. 安装以下环境 pip install celery pip install redis pip install eventlet # celery 4.0版本以后不支持在windows运行&#xff0c;还需额外安装eventlet库本文环境为&#xff1a;python3.9.4Django4.2.11celery5.3.6redis5.0.3 2. 配置setting.py文件 在sett…

汽车制造产生的污废水如何处理排放

汽车制造业是一个重要的工业领域&#xff0c;然而&#xff0c;伴随着汽车制造过程中的各种化学反应和材料加工&#xff0c;大量污废水也随之产生。为了保护环境和社会的可持续发展&#xff0c;汽车制造产生的污废水需要得到妥善处理和排放。 首先&#xff0c;针对汽车制造中涉及…

前端vue实现甘特图

1 什么是甘特图 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名&#xff0c;是项目管理、生产排程、节点管理中非常常见的一个功能。 甘特图内在思想简单&#xff0c;即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的…

01.Linked-List-Basic

1. 链表简介 1.1 链表定义 链表&#xff08;Linked List&#xff09;&#xff1a;一种线性表数据结构。它使用一组任意的存储单元&#xff08;可以是连续的&#xff0c;也可以是不连续的&#xff09;&#xff0c;来存储一组具有相同类型的数据。 简单来说&#xff0c;「链表」…

web渗透测试漏洞复现:Elasticsearch未授权漏洞复现

web渗透测试漏洞复现 Elasticsearch未授权漏洞复现Elasticsearch简介Elasticsearch复现Elasticsearch漏洞修复和加固措施 Elasticsearch未授权漏洞复现 Elasticsearch简介 Elasticsearch 是一款 Java 编写的企业级搜索服务&#xff0c;它以分布式多用户能力和全文搜索引擎为特…

功能齐全的免费 IDE Visual Studio 2022 社区版

面向学生、开放源代码和单个开发人员的功能齐全的免费 IDE 下载地址 Visual Studio 2022 社区版 - 下载最新的免费版本 Visual Studio 2022 Community Edition – Download Latest Free Version 准备安装 选择需要安装的程序 安装进行中 使用C学习程序设计相关知识并培养编程…

AI基础知识(3)--神经网络,支持向量机,贝叶斯分类器

1.什么是误差逆传播算法&#xff08;error BackPropagation&#xff0c;简称BP&#xff09;&#xff1f; 是一种神经网络学习算法。BP是一个迭代学习算法&#xff0c;在迭代的每一轮使用广义的感知机学习规则对参数进行更新估计。基于梯度下降&#xff08;gradient descent&am…

安卓RecyclerView简单用法

废话不多说上代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schem…

LeetCode---388周赛

题目列表 3074. 重新分装苹果 3075. 幸福值最大化的选择方案 3076. 数组中的最短非公共子字符串 3077. K 个不相交子数组的最大能量值 一、重新分装苹果 注意题目中说同一个包裹中的苹果可以分装&#xff0c;那么我们只要关心苹果的总量即可&#xff0c;在根据贪心&#x…

华为汽车业务迎关键节点,长安深蓝加入HI模式,车BU预计今年扭亏

‍编辑 |HiEV 一年之前&#xff0c;同样是在电动汽车百人会的论坛上&#xff0c;余承东在外界对于华为和AITO的质疑声中&#xff0c;第一次公开阐释了华为选择走智选车模式的逻辑。 一年之后&#xff0c;伴随问界M7改款、问界M9上市&#xff0c;华为智选车模式的面貌已经发生了…

让图片适应标签的CSS object-fit属性

在实际的项目运行过程中&#xff0c;可能出现运营人员上传的文件与预期的图片尺寸不同的情况&#xff0c;为了解决这一问题可以使用 object-fit 属性&#xff0c;对嵌入的图像&#xff08;以及其他替代元素&#xff0c;如视频&#xff09;做相应的变化&#xff0c;更加精确地控…