C++ 前K个高频单词的六种解法

目录

 大堆

小堆

vector+sort

 vector+stable_sort

multimap

set/multiset

与GPT的对话

1.对于比较类型中 < 运算符重载的理解

2.map有稳定性的说法吗

​编辑

3.为什么map和set类的仿函数后面要加const来修饰*this

5.关于名词的理解

6.匿名对象对类要求

7.map和set的基本知识


 

分析:其实就是选择一种容器排序,需要能够存放一对元素,可以想到使用map,unordered_map,vector,pair

堆:

        个人理解:比较的时候左边是parent,右边是child,所以当仿函数是小于号时候,也就是孩子大,接下来进行交换,大的自然往就上走;对于一般的线性结构小于升序,大于降序,我觉得是这样的nums[right]<nums[left]

 大堆

 可以建大堆,也可以小堆

1.大堆,就是大的在根,这样的话就不能建立一个大小为K的堆,只能全部梭哈

2. 比较逻辑是根据题意来的,个数优先,其次在个数相同的时是字典序,所以肯定有个或(“ | | ”)

class Solution {
public:
    typedef pair<string, int> PSI;
    struct cmp
    {
        bool operator()(const PSI& kv1, const PSI& kv2)
        {
            return kv1.second < kv2.second || kv1.second == kv2.second 
                && kv1.first > kv2.first;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> m;
        for(auto& e : words)
            m[e]++;
        priority_queue<PSI, vector<PSI>, cmp> heap(m.begin(), m.end());

        vector<string> ret;
        for(int i = 0; i < k; i++)
            ret.push_back(heap.top().first), heap.pop();
        return ret;
    }
};

小堆

 1.如果堆里的K个元素就是符合条件的,那么只能小根堆;遇到新的元素先push进来,如果size() > K那么就pop()

2.在输出方面:因为只能取出堆顶元素,如果选择正着存,可以使用ret.push_back() + reverse

如果是想一步到位那么就放到对应的下标里,注意:需要提前开空间初始化(也就是赋值),因为单单开空间是不能使用下标来访问元素(其实是很有道理的,没有初始化这个数据就是不属于你,就是不应该有访问权限,可是我是修改这个位置的值,不是访问啊;修改的前提是有访问的权限,有访问权限才有修改资格),可以使用resize或者创建对象的时候就初始化

 3.cmp与大堆相反

class Solution {
public:
    typedef pair<string, int> PSI;
    struct cmp
    {
        bool operator()(const PSI& kv1, const PSI& kv2)
        {
            return kv1.second > kv2.second || kv1.second == kv2.second 
                && kv1.first < kv2.first;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> m;
        for(auto& e : words)
            m[e]++;
        priority_queue<PSI, vector<PSI>, cmp> heap;
        for(auto& e : m)
        {
            heap.push(e);
            if(heap.size() > k) heap.pop();
        }
        // vector<string> ret(k);
        // for(int i = k - 1; i >= 0; i--)
        //     ret[i] = heap.top().first, heap.pop();
        vector<string> ret;
        for(int i = 0; i < k; i++)
            ret.push_back(heap.top().first), heap.pop();
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

vector+sort

class Solution {
public:
    typedef pair<string, int> PSI;
    struct cmp
    {
        bool operator()(const PSI& kv1, const PSI& kv2) 
        {
            return kv1.second > kv2.second || kv1.second == kv2.second
                && kv1.first < kv2.first;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> count_map;
        for(auto& v : words)
            count_map[v]++;
        vector<pair<string, int>> v(count_map.begin(), count_map.end());
        sort(v.begin(), v.end(), cmp());

        vector<string> ret;
        for(int i = 0; i < k; i++)
            ret.push_back(v[i].first);
        return ret;
    }
};

 vector+stable_sort

稳定性指的是元素在原始序列中的相对顺序,这里不需要写个数相同情况下字典序的比较,是因为map默认就是less<key>,如果掉默认的greater(),那么遇到比较时传的是pair的运算符重载

class Solution {
public:
    typedef pair<string, int> PSI;
    struct cmp
    {
        bool operator()(const PSI& kv1, const PSI& kv2) 
        {
            return kv1.second > kv2.second;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> count_map;
        for(auto& v : words)
            count_map[v]++;
        vector<pair<string, int>> v(count_map.begin(), count_map.end());
        stable_sort(v.begin(), v.end(), cmp());

        vector<string> ret;
        for(int i = 0; i < k; i++)
            ret.push_back(v[i].first);
        return ret;
    }
};

multimap

1. 不熟练->写出这样的map<pair<string, int>, cmp>类型,导致下面push_back报错(没有匹配的函数),那么也就不能用map的迭代器了,类型不配了

2. 

cmp传的参数只能是第一次参数,所以int必须在string前面,那么为什么保证了字典序?我觉得是因为第一个map

问题:会发现仿函数后面有const,前面的容器为什么不需要?map和set就要?

class Solution {
public:
    typedef pair<string, int> PSI;
    struct cmp
    {
        bool operator()(const int key1, const int key2) const
        {
            return key1 > key2;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> count_map;
        for(auto& str : words)
            count_map[str]++;
        // map<pair<string, int>, cmp> sort_map(count_map.begin(), count_map.end());

        // multimap<string, int, cmp> sort_map(count_map.begin(), count_map.end());
        // multimap<int, string, cmp> sort_map(count_map.begin(), count_map.end());
        multimap<int, string, cmp> sort_map;
        for(auto& e : count_map)
            sort_map.insert({e.second, e.first});
            // sort_map.insert(make_pair(e.second, e.first));

        vector<string> ret;
        auto it = sort_map.begin();
        for(int i = 0; i < k; i++)
        {
            ret.push_back(it->second);
            it++;
        }
        return ret;
    }
};

set/multiset

map和set的取值只能通过迭代器

这个地方的multiset和set效果是一样的,因为每一pair都是不一样的

class Solution {
public:
    typedef pair<string, int> PSI;
    struct cmp
    {
        bool operator()(const PSI& kv1, const PSI& kv2) const
        {
            return kv1.second > kv2.second || kv1.second == kv2.second && kv1.first < kv2.first;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> count_map;
        for(auto& str : words)
            count_map[str]++;

        set<PSI, cmp> sort_set(count_map.begin(), count_map.end());
        //multiset<PSI, cmp> sort_set(count_map.begin(), count_map.end());

        vector<string> ret;
        auto it = sort_set.begin();
        for(int i = 0; i < k; i++)
        {
            ret.push_back(it->first);
            it++;
        }
        return ret;
    }
};

与GPT的对话

1.对于比较类型中 < 运算符重载的理解

升序是less,重载的是 < (小于号)

2.map有稳定性的说法吗

3.为什么map和set类的仿函数后面要加const来修饰*this

我没怎么看懂,以现在的功力只能记住map和set中的比较类型的()运算符重载的成员函数,需要加上const

5.关于名词的理解

6.匿名对象对类要求

7.map和set的基本知识

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

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

相关文章

面向对象:继承

文章目录 一、什么叫继承&#xff1f;二、单继承三、多继承3.1多继承的各种情况3.1.1一般情况3.1.1特殊情况&#xff08;菱形继承&#xff09; 四、菱形继承引发的问题4.1 问题1:数据冗余4.2 问题2:二义性&#xff08;无法确定到底是访问哪个&#xff09; 五、虚拟继承解决菱形…

深度剖析鞋服品牌商品数字化管理的重要性

随着信息技术的迅猛发展与市场竞争的加剧&#xff0c;鞋服品牌商品数字化管理的重要性愈发凸显。数字化管理不仅关乎企业运营效率的提升&#xff0c;更是品牌实现差异化竞争、提升顾客体验、构建智慧零售生态的关键所在。对于鞋服品牌企业而言&#xff0c;提升商品数字化管理的…

python中raise_for_status方法的作用

文章目录 说明示例1&#xff1a;基本使用示例2&#xff1a;多种异常 说明 raise_for_status() 方法在 Python 的 requests 库中用于在发送 HTTP 请求后检查响应的状态码。如果响应的状态码表示请求未成功&#xff08;即状态码不是 2xx&#xff09;&#xff0c;则该方法会抛出一…

C/C++中重载函数取地址的方法

目录 1.现象 2.指定参数取函数地址 3.利用Qt的类QOverload 1.现象 函数重载在C/C编码中是非常常见的&#xff0c;但是我们在std::bind或std::function绑定函数地址的时候&#xff0c;直接取地址&#xff0c;程序编译就会报错&#xff0c;示例如下&#xff1a; class CFunc1…

【全套源码教程】基于SpringBoot+MyBatis框架的智慧生活商城系统的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台功能拓展 商品详情单管理 个人中心 秒杀活动 推荐系统 评论与评分系统 后台功能拓…

慢工之旅:婺源的故事

在当今这个快节奏、高竞争的时代&#xff0c;我们常常发现自己处于持续的忙碌和压力之中。然而&#xff0c;在今年春季&#xff0c;我们选择了一条不同的道路——一次团队旅行到江西婺源。这不仅是一场远离日常工作的旅行&#xff0c;而且成为了我们团队对工作、生活及寻求内心…

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

matplotlib中的颜色表示方法

matplotlib中的颜色表示方法 1.RGB或RGBA格式 格式示例以一个3元素或4元素的tuple来表示颜色&#xff0c;每个元素取值范围是[0,1](0.1,0.2,0.5) (0.1,0.2,0.5,0.3)大小写不敏感的16进制表示法#0F0F0F等价于#0x0f0f0f等价于(15/255,15/255,15/255)带透明度的#0f0f0f80简短的…

Qt_day4:2024/3/25

作业1&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

Java毕业设计-基于Spring Boot的在线考试系统-毕业论文+答辩ppt(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统登录注册2、管理员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于Spring Boot的在线考试系统-毕…

Linux之冯诺依曼体系,操作系统,进程的理解,进程状态,以及进程的优先级

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.冯诺依曼体系 二.操作系统 2.1概念 2.2结构示意图&…

面试产品经理,怎样描述过往经历,才能让面试官印象深刻?

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;给大家分享这篇产品经理面试干货文章&#xf…

搬运5款有趣又好用的软件

​ 如果你想让你的电脑使用更方便、更有趣、更专业&#xff0c;那么你一定要看看这篇文章&#xff0c;因为我要给你推荐五款好用又有趣的WIN10软件。 1. 文字识别——PandaOCR ​ PandaOCR是一款高效的文字识别软件&#xff0c;可快速将图片中的文字转化为可编辑的文本。其识…

2024年MathorCup数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

刚刚,璞华科技、璞华易研PLM产品荣获智能制造领域两大奖项!

刚刚&#xff0c;在e-works数字化企业网于北京举办的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”上&#xff0c;璞华科技凭借在智能制造领域的雄厚实力和产品口碑&#xff0c;荣获两大奖项。 璞华科技被评为e-works【2023年度智能制造优秀供应…

20232831 2023-2024-2 《网络攻防实践》第4次作业

目录 20232831 2023-2024-2 《网络攻防实践》第4次作业1.实验内容2.实验过程&#xff08;1&#xff09;ARP缓存欺骗攻击&#xff08;2&#xff09;ICMP重定向攻击&#xff08;3&#xff09;SYN Flood攻击&#xff08;4&#xff09;TCP RST攻击&#xff08;5&#xff09;TCP会话…

为什么你的企业需要渗透测试

渗透测试是什么&#xff1f; 渗透测试是在安全、符合规定并且受控的条件下针对公司精心策划的经过批准的网络攻击。渗透测试人员努力发现和利用组织环境的设定范围内的漏洞&#xff0c;在黑客等犯罪分子利用它们之前提前分析弱点。 渗透测试通常是安全审计的一部分&#xff0…

大规模云存储展望|2024逐步复苏,2025全面恢复

SSD以其高速度和低延迟等优点&#xff0c;尤其在容量增长和每GB成本降低方面&#xff0c;SSD的增长速度预计将超过近线硬盘&#xff08;Nearline HDD&#xff09;。尽管HDD在大容量存储方面仍有一定优势&#xff0c;但由于SSD在访问速度、能耗及体积等方面的突出表现&#xff0…

fastapi学习记录

今天看了点fastap&#xff0c;简单记录下&#xff0c;fastapi是一个python下的后端框架。 参考学习网站菜鸟教程 安装 pip install fastapi pip install "uvicorn[standard]"安装好了以后就可以直接使用&#xff0c;最主要的使用方式就是写接口嘛&#xff0c;get&a…
最新文章