【Cpp】前K个高频单词-排序的稳定性

news2024/9/21 2:34:43

文章目录

  • 题目
  • 思路1--使用sort排序并优化其稳定性
    • 方法一:
    • 方法二
  • 思路2--multiset

题目

https://leetcode.cn/problems/top-k-frequent-words/description/
在这里插入图片描述

思路1–使用sort排序并优化其稳定性

我们可以直接先将每个单词出现的次数用一个CountMap统计出来,然后放入一个vector中使用sort方法

class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
        {
            return kv1.second > kv2.second;
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
        sort(v.begin(),v.end(),Compare());

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

但是这样写是不能通过的,因为sort的排序是不稳定的!
需要我们优化一下:

方法一:

stable_sort-稳定排序
直接将sort换成stable_sort就可以了

class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
        {
            return kv1.second > kv2.second;
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
        stable_sort(v.begin(),v.end(),Compare());

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

方法二

改写一下仿函数的书写规则

class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& 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> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
        sort(v.begin(),v.end(),Compare());

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

思路2–multiset

set本身也可以排序,只不过也需要我们自己写一个仿函数

class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& 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> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        
        set<pair<string,int>,Compare> SortSet(CountMap.begin(),CountMap.end());
        //使用multiset也可以

        vector<string> ret;
        auto it = SortSet.begin();
        while(k--)
        {
            ret.push_back(it->first);
            ++it;
        }
        return ret;
    }
};

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

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

相关文章

超级详细的华为OSPF实验及配置

什么是OSPF&#xff1f; 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用的是OSPF Version 2&#xff08;RFC2328&#x…

【Linux】8、查看 Linux 主机运行状态、压缩和解压缩命令、Linux 的环境变量

目录 一、查看 Linux 系统资源占用二、硬盘信息监控三、网络监控命令四、Linux 文件上传和下载命令五、压缩和解压(1) 压缩格式(2) tar 命令 六、Linux 的环境变量 一、查看 Linux 系统资源占用 ✒️ 可通过 top 命令查看系统的 CPU、内存的使用情况&#xff08;类似 Windows …

超详细Redis入门教程——Redis 持久化

前言 本文小新为大家带来 超详细Redis入门教程——Redis 持久化 相关知识&#xff0c;具体内容包括持久化基本原理&#xff0c;RDB 持久化&#xff08;包括&#xff1a;持久化的执行&#xff0c;RDB 优化配置&#xff0c;RDB 文件结构&#xff0c;RDB 持久化过程&#xff09;&a…

台灯护眼灯哪个牌子好用?真正适合学生使用的护眼台灯

最近家里一款陪伴了多年的灯泡的台灯因为年久失修已经损坏了&#xff0c;导致不得不换个台灯&#xff0c;而换台灯就不得不仔细挑选&#xff0c;毕竟是需要长期使用的&#xff0c;对视力方面影响还是很大的&#xff0c;通常老式台灯的光照明显对视力都产生不了太大保护&#xf…

AI可以实现陪伴需求吗

在现代社会&#xff0c;科技日新月异&#xff0c;个性化AI定制服务已经成为一种新型的科技应用&#xff0c;被越来越多的人所接受和使用。个性化AI定制是一种基于人工智能技术的个性化服务&#xff0c;它可以帮助我们更好地规划生活&#xff0c;为我们提供情感上的陪伴和生活上…

Go 1.21新特性前瞻

Go 1.21版本[1]正在如火如荼地开发当中&#xff0c;按照Go核心团队的一年两次的发布节奏来算&#xff0c;Go 1.21版本预计将在2023年8月发布(Go 1.20版本[2]是在2023年2月份发布的)。 本文将和大家一起看看Go 1.21都会带来哪些新特性。不过由于目前为时尚早&#xff0c;下面列出…

AI绘图实战(七):室内设计线稿渲染、景观设计手绘稿改动、建筑照片转线稿|Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …

03.DolphinScheduler资源中心

文章目录 文件管理基础操作创建文件上传文件文件查看下载文件文件重命名删除文件 任务样例创建 shell 文件创建工作流执行文件查看结果 UDF管理函数管理任务样例编写 UDF 函数配置 UDF 函数使用 UDF 函数 任务组管理任务组配置新建任务组查看任务组队列任务组的使用 任务组的实…

【刷题】Java日常刷题1

A.Sort the Subarray 题意&#xff1a;给出一个数组&#xff0c;一个在此基础上被操作过的数组&#xff0c;找出被操作过的最长的非递减连续序列。 题解&#xff1a;这道题最开始写就被给的样例迷惑了&#xff0c;给出的样例都是被操作过出现非递减序列的片段&#xff0c;因此…

No.049<软考>《(高项)备考大全》【冲刺3】《软考之 119个工具 (1)》

《软考之 119个工具 &#xff08;2&#xff09;》 1.专家判断2.引导技术:3.项目管理信息系统:4.会议:5.分析技术:6.变更控制工具:7.访谈:8.焦点小组会议:9.引导式研讨会:10.群体创新技术:11.群体决策技术:12.问卷调查:13.观察:14.原型法:15.标杆对照:16.系统交互图:17.文件分析…

Django基于大数据的应届生求职系统

背景 科学技术日新月异的如今&#xff0c;计算机在生活各个领域都占有重要的作用&#xff0c;尤其在信息管理方面&#xff0c;在这样的大背景下&#xff0c;学习计算机知识不仅仅是为了掌握一种技能&#xff0c;更重要的是能够让它真正地使用到实践中去&#xff0c;以创新的视…

又是DNA甲基化,孕期母亲的压力会影响儿童健康

产前母亲的生活压力事件与后代神经发育不良相关联。研究人员表示&#xff0c;关联的生物学机制大部分是未知的&#xff0c;但在体内发生的一种化学反应——DNA甲基化&#xff0c;即一个小分子甲基被添加到DNA上——可能起着一定作用。这些发现可为了解胎儿环境如何可能影响神经…

【LeetCode】189. 轮转数组

题目链接&#xff1a;https://leetcode.cn/problems/rotate-array/ &#x1f4d5;题目要求&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 尽可能想出更多的解决方案&#xff0c;至少有 三种 不同的方法可以…

MTC-PD65W1C-CTA1快充电源-使用MTC-650V Cascode D-GaN

本电源模块是65W单一C界面&#xff0c;其输出电压由协议IC可以控制5V/3A, 9V/3A, 15V/3A, 20V/3.25A等电压输出&#xff0c;使用QR/DCM反驰式电路架构于输出20V重载时可达93%效率及功率密度可达1.5W/cm3&#xff0c;本系统采用同系列控制单晶片&#xff1a;QR一次侧控制IC驱动M…

【云计算•云原生】3.一小时熟练掌握docker容器

文章目录 docker简介ubuntu下安装dockerkali下安装dockerdocker基本命令docker搭建mysql、nginx、redis容器/镜像打包搭建私有镜像仓库docker网络管理Dockerfile文件docker-compose.yml示例&#xff1a;搭建lamp docker简介 docker是一个开源的应用容器引擎&#xff0c;可以让…

软件著作权登记版权保护中心下发补正修改指南

本文为大家介绍常见版权中心下发的补正问题及对应修改方法。 一、补正是什么意思&#xff1f; 补正&#xff0c;即增补订正。 下发补正指版权保护中心发现软件著作权登记材料中存在一些格式/内容上的问题&#xff0c;予以驳回。要求著作权人或代理人依照补正意见内容对材料进…

电影《灌篮高手》观后

上周和同学一起看了电影《灌篮高手》这部电影&#xff0c;个人以前没有看过相关漫画和动画&#xff0c;但记得&#xff0c;看过海报和一些宣传物品&#xff0c;有的衣服上&#xff0c;有文具盒上&#xff0c;也都出现过&#xff0c;而且是在自己小时候&#xff0c;可见当时的影…

(中)苹果有开源,但又怎样呢?

上篇&#xff08;详情请戳&#xff1a;《&#xff08;上&#xff09;苹果有开源&#xff0c;但又怎样呢&#xff1f; 》&#xff09;里说到&#xff0c;苹果首个开源项目 Darwin 的诞生&#xff0c;与乔布斯的复仇归来有着千丝万缕的关系。 作为一个开源的操作系统&#xff0c…

【JAVA】将两个字符串相乘并返回字符串

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : Java &#x1f606;今日分享 : 越忙越不能熬夜. —晚安 , 好梦. 将两个字符串相乘并返回字符串 &#x1f33b;前言:✔题目:&#x1f50e;代码详情:1.创建字符创对象:2.将字符串转化为数字:3.数字相乘,并转化为字符串家人们,点…

[C++]——C++基础知识点(C++和C语言的区别)

文章目录 1. 前言2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C的输入输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理——名字修饰 6. 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 引用的使用场景6.5 引用和指针的…