每日OJ题_优先级队列_堆③_力扣692. 前K个高频单词

目录

力扣692. 前K个高频单词

解析代码


力扣692. 前K个高频单词

692. 前K个高频单词

难度 中等

给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。

示例 1:

输入: words = ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
    注意,按字母顺序 "i" 在 "love" 之前。

示例 2:

输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
输出: ["the", "is", "sunny", "day"]
解析: "the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,
    出现次数依次为 4, 3, 2 和 1 次。

注意:

  • 1 <= words.length <= 500
  • 1 <= words[i] <= 10
  • words[i] 由小写英文字母组成。
  • k 的取值范围是 [1, 不同 words[i] 的数量]

进阶:尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {

    }
};

解析代码

一道Topk问题的拓展,有点考验语法能力:

稍微处理一下原数组:

  • 需要知道每一个单词出现的频次,因此可以先使用哈希表,统计出每一个单词出现的频次。
  • 然后在哈希表中,选出前 k 大的单词(为什么不在原数组中选?因为原数组中存在重复的单词,哈希表里面没有重复单词,并且还有每一个单词出现的频次)

如何使用堆,拿出前 k 大元素:

一、先定义一个自定义排序,我们需要的是前 k 大,因此需要一个小根堆。但是当两个字符串的频次相同的时候,我们需要的是字典序较小的,此时是一个大根堆的属性,在定义比较函数的时候需要注意。

  • 当两个字符串出现的频次不同的时候:需要的是基于频次比较的小根堆
  • 当两个字符串出现的频次相同的时候:需要的是基于字典序比较的大根堆

二、定义好比较器之后,依次将哈希表中的字符串插入到堆中,维持堆中的元素不超过 k 个。

三、遍历完整个哈希表后,堆中的剩余元素就是前 k 大的元素

class Solution {
public:
    struct cmp
    {
        bool operator()(const pair<string, int>& p1, const pair<string, int>& p2)
        {
            if(p1.second ==  p2.second) // 频次相同,字典序排序,小的在前,大根堆less
                return p1.first < p2.first;
            return p1.second > p2.second; // 频次大的在前->小根堆greater
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map<string, int> hash;
        for(auto& e : words) // 字符和频次映射到哈希表
        {
            hash[e]++;
        }
        priority_queue<pair<string, int>, vector<pair<string, int>>, cmp> heap;
        for(auto& e : hash) // Topk主逻辑
        {
            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();
        }
        return ret;
    }
};

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

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

相关文章

潜水后可以戴耳机吗?精选四款防水游泳耳机,不惧水压挑战

随着生活水平的提高&#xff0c;人们越来越注重健康与休闲娱乐。潜水作为一项集运动、探险和乐趣于一身的活动&#xff0c;近年来受到了越来越多的关注。然而&#xff0c;在享受潜水带来的乐趣的同时&#xff0c;我们也希望能够在水下保持与外界的联系&#xff0c;例如欣赏音乐…

经济学 赋税

赋税&#xff1a; 1.为政府服务提供金钱来源 2. 用于保护环境 3.帮助国家使用财政和货币政策&#xff0c;推动经济增长 4.再分配社会财富的一种方式&#xff0c;平衡富人和穷人的贫富差距 5.帮助我们支付市场自身可能无法实现的服务&#xff0c;比如公共安全&#xff0c;国…

【MySQL】解决修改密码时报错:--skip-grant-tables option

首先我们先了解到为何会出现如上报错&#xff1a; 是因为我们在第一次配置MySQL中的my.cnf时&#xff0c;我们添加了–skip–grant-tables 选项 跳过验证身份的选项 所以&#xff0c;我们第一次登录成功后想要修改密码会出现如下报错&#xff1a; [hxiZ0jl69kyvg0h181cozuf5Z…

如何高效学习Python编程语言

理解Python的应用场景 不同的编程语言有不同的发展历史和应用场景,了解Python主要应用在哪些领域对于学习它会有很大帮助。Python最初是一种通用脚本语言,主要用于系统级任务自动化。随着时间的推移,它逐步成为数据处理、科学计算、Web开发、自动化运维等众多领域的主要编程语…

Vue - 3( 15000 字 Vue 入门级教程)

一&#xff1a;初识 Vue 1.1 收集表单数据 收集表单数据在Vue.js中是一个常见且重要的任务&#xff0c;它使得前端交互变得更加灵活和直观。 Vue中&#xff0c;我们通常使用v-model指令来实现表单元素与数据之间的双向绑定&#xff0c;从而实现数据的收集和更新。下面总结了…

深入浅出 -- 系统架构之负载均衡Nginx反向代理

一、Nginx反向代理-负载均衡 首先通过SpringBootFreemarker快速搭建一个WEB项目&#xff1a;springboot-web-nginx&#xff0c;然后在该项目中&#xff0c;创建一个IndexNginxController.java文件&#xff0c;逻辑如下&#xff1a; Controller public class IndexNginxControl…

卷积神经网络实战

构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别&#xff0c;需重新设计&#xff0c;训练模块基本一致 1.首先读取数据 - 分别构建训练集和测试集&#xff08;验证集&#xff09; - DataLoader来迭代取数据 # 定义超参数 input_size 28 #图像的总尺寸28*28…

优雅强大的前端管理模板——Soybean Admin

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识&#xff0c;也有全栈交流学习摸鱼群&#xff0c;期待您的关注! 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0…

python 03序列(列表和元组)

列表 1.创建 x[1,2,3,4,5,6,7,8,9,10] print(x) 或者是 y[a,b,c,d,e,f,g,h] print(y) 2.访问 &#xff08;1&#xff09;取出一个元素 x[0] #取出第0号&#xff0c;即List里第一个元素 &#xff08;2&#xff09;取出多个连续元素 通过两个索引值实现&#xff0c;第一…

专题【双指针】【学习题】刷题日记

题目列表 11. 盛最多水的容器 42. 接雨水 15. 三数之和 16. 最接近的三数之和 18. 四数之和 26. 删除有序数组中的重复项 27. 移除元素 75. 颜色分类 167. 两数之和 II - 输入有序数组 2024.04.06 11. 盛最多水的容器 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂…

MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数

系列文章目录 前言 模型预测控制器使用线性工厂、干扰和噪声模型来估计控制器状态并预测未来的工厂输出。控制器利用预测的设备输出&#xff0c;解决二次规划优化问题&#xff0c;以确定控制动作。 有关模型预测控制器结构的更多信息&#xff0c;请参阅 MPC 预测模型。 一、语法…

SpringMVC--概述 / 入门

目录 1. SpringMVC简介 2. 配置&入门 2.1. 开发环境 2.2. 创建maven工程 2.3. 手动创建 web.xml 2.4. 配置web.xml 2.4.1. 默认配置方式 2.4.2. 扩展配置方式 2.5. 创建请求控制器 2.6. 创建springMVC的配置文件 2.7. 测试 HelloWorld 2.7.1. 实现对首页的访问…

OJ在线比赛系统(人员管理、赛题发布、在线提交、题目审核、成绩录入)

系统功能设计 技术栈&#xff1a;springboot&#xff0c;jdk8,vue3,element-plus,mybatis-plus 1.java后端系统 首先需要学生通过前端注册页面和java后端系统将个人信息写入数据库&#xff0c;包含学号、姓名、班级以及需要爬取网站的相关信息&#xff08;例如AtCoder账号信…

智谱清言 HTTP调用 + postman使用

官方教程 接口鉴权 非SDK用户鉴权 官方网站 第一步 获取您的 API Key 第二步 使用 JWT 组装 用户端需引入对应 JWT 相关工具类&#xff0c;并按以下方式组装 JWT 中 header、payload 部分 1、header 具体示例 {“alg”:“HS256”,“sign_type”:“SIGN”} alg : 属性表…

批量导入svg文件作为图标使用(vue3)vite-plugin-svg-icons插件的具体应用

目录 需求svg使用简述插件使用简述实现安装插件1、配置vite.config.ts2、src/main.ts引入注册脚本3、写个icon组件4、使用组件 需求 在vue3项目中&#xff0c;需要批量导入某个文件夹内数量不确定的svg文件用来作为图标&#xff0c;开发完成后能够通过增减文件夹内的svg文件&a…

ICLR 2024 | 联邦学习后门攻击的模型关键层

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 联邦学习使多个参与方可以在数据隐私得到保护的情况下训练机器学习模型。但是由于服务器无法…

论文阅读——MVDiffusion

MVDiffusion: Enabling Holistic Multi-view Image Generation with Correspondence-Aware Diffusion 文生图模型 用于根据给定像素到像素对应关系的文本提示生成一致的多视图图像。 MVDiffusion 会在给定任意每个视图文本的情况下合成高分辨率真实感全景图像&#xff0c;或将…

亚信安慧AntDB:开启数据洞察的新视野

AntDB一直秉承着“技术生态”的理念&#xff0c;不断进行技术创新和功能增强&#xff0c;以保持与先进数据库系统的竞争力。作为一款致力于提升数据库处理性能和稳定性的系统&#xff0c;AntDB在技术上始终保持敏锐的洞察力&#xff0c;不断汲取国内外先进技术的精华&#xff0…

Scala大数据开发

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Scala简述 在此&#xff0c;简要介绍 Scala 的基本信息和情况。 Scala释义 Scala 源自于英语单词scalable&#xff0c;表示可伸缩的、可扩展的含义。 Scala作者 Scala编…

tomcat 结构目录

bin 启动&#xff0c;关闭和其他脚本。这些 .sh文件&#xff08;对于Unix系统&#xff09;是这些.bat文件的功能副本&#xff08;对于Windows系统&#xff09;。由于Win32命令行缺少某些功能&#xff0c;因此此处包含一些其他文件。比如说&#xff1a;windows下启动tomcat用的是…