【算法刷题】前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 次。

题目链接

解法一:小根堆
先用哈希表统计单词的出现频率,然后因为题目要求前 K 大。所以构建一个 大小为 K 的小根堆按照上述规则自定义排序的比较器。然后依次将单词加入堆中,当堆中的单词个数超过 K 个后,我们需要弹出顶部最小的元素使得堆中始终保留 K 个元素,遍历完成后剩余的 K 个元素就是前 K 大的。最后我们依次弹出堆中的 K 个元素加入到所求的结果集合中。

注意:因为构建的是小根堆,所以从顶部弹出的元素顺序是从小到大的,所以最后我们还需要反转集和。

public class Solution {public List<String> topKFrequent(String[] words, int k) {// 1.初始化 哈希表 key -> 字符串 value -> 出现的次数。Map<String, Integer> count = new HashMap<>();for (String word : words) {count.put(word, count.getOrDefault(word, 0) + 1);}// 2.用 list 存储字符 key 然后自定义 Comparator 比较器对 value 进行排序。List<String> candidates = new ArrayList<>(count.keySet());// 此处为使用 lambda 写法candidates.sort((a, b) -> {// 字符串频率相等按照字典序比较使得大的在堆顶,Java 可以直接使用 compareTo 方法即可。if (count.get(a).equals(count.get(b))) {return a.compareTo(b);} else {// 字符串频率不等则按照频率排列。return count.get(b) - count.get(a);}});// 3.截取前 K 大个高频单词返回结果。return candidates.subList(0, k);        }    
}

排序关键处不使用 lambda 写法如下:

PriorityQueue<String> minHeap = new PriorityQueue<>(new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {if (count.get(s1).equals(count.get(s2))) {return s2.compareTo(s1);} else {return count.get(s1) - count.get(s2);}}
});

复杂度分析

  • 时间复杂度:O(Nlog⁡(K))。其中 N 是 words 数组的长度。起初我们用 O(N) 的时间计算每个单词的频率,然后将 N 个单词添加到堆中(堆的大小最大为 K ),添加每个单词的时间为 O(log⁡(K))。总共消耗 O(Nlog⁡(K))。弹出 K 次我们忽略不计,所以总共是 O(Nlog⁡(K))。
  • 空间复杂度:O(N)。需要建堆和用哈希表计数。

解法二:利用哈希表排序然后返回前 KKK 个元素

我们用哈希表存储所有单词出现的次数,key 为单词 value 为频率次数。然后根据哈希表中的 value 进行排序,排序的规则还是上文所分析的,下面给出代码。

public class Solution {public List<String> topKFrequent(String[] words, int k) {// 1.初始化 哈希表 key -> 字符串 value -> 出现的次数。Map<String, Integer> count = new HashMap<>();for (String word : words) {count.put(word, count.getOrDefault(word, 0) + 1);}// 2.用 list 存储字符 key 然后自定义 Comparator 比较器对 value 进行排序。List<String> candidates = new ArrayList<>(count.keySet());// 此处为使用 lambda 写法candidates.sort((a, b) -> {// 字符串频率相等按照字典序比较使得大的在堆顶,Java 可以直接使用 compareTo 方法即可。if (count.get(a).equals(count.get(b))) {return a.compareTo(b);} else {// 字符串频率不等则按照频率排列。return count.get(b) - count.get(a);}});// 3.截取前 K 大个高频单词返回结果。return candidates.subList(0, k);        }    
}

排序关键处不使用 lambda 写法如下:

candidates.sort(new Comparator<String>() {@Overridepublic int compare(String a, String b) {if (count.get(a).equals(count.get(b))) {return a.compareTo(b);} else {return count.get(b) - count.get(a);}}
});

复杂度分析:

  • 时间复杂度:O(Nlog⁡(N))。其中 N 是 words 的长度。需要 O(N) 时间计算每个单词的频率,然后集合排序需要 O(Nlog⁡(N))。

  • 空间复杂度:O(N)。使用哈希表来存储单词的空间。

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

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

相关文章

Flask 项目自动生成 API 文档的高效实践

Flasgger&#xff0c;作为一款强大的 Flask 扩展&#xff0c;自动从 Flask 应用中提取并生成 OpenAPI 规范文档&#xff0c;配备 SwaggerUI&#xff0c;为开发者提供了一条快捷通道&#xff0c;让 API 的文档编制和交互式测试变得简单易行。Flasgger 的设计原则是简化开发流程&…

【已解决】c++ qt选中该行为什么该列部分变色

笔者开启了QTableView中交替行改变颜色&#xff0c;发现笔者自定义绘制的水平滚动条&#xff0c;在选中后不发生颜色改变&#xff0c;这让笔者很疑惑。笔者查阅资料后发现&#xff0c;自定义绘制的控件&#xff0c;要自身设置颜色。当笔者解决了这个问题时&#xff0c;顺手就将…

flutter 操作mysql

引入模块 dependencies: flutter: sdk: flutter mysql1: ^0.20.0 mysql helper 的代码 import dart:async; import package:mysql1/mysql1.dart; class MySqlHelper { static const _host localhost; static const _port 3333; static const _user user; static c…

6.0 MapReduce 服务使用教程

在学习了之前的 MapReduce 概念之后&#xff0c;我们应该已经知道什么是 Map 和 Reduce&#xff0c;并了解了他们的工作方式。 本章将学习如何使用 MapReduce。 Word Count Word Count 就是"词语统计"&#xff0c;这是 MapReduce 工作程序中最经典的一种。它的主要…

PyTorch中的nn.Embedding的使用、参数及案例

PyTorch中的nn.Embedding的使用 Embedding层在神经网络中主要起到降维或升维的作用。具体来说&#xff0c;它通过将输入&#xff08;通常是离散的、不连续的数据&#xff0c;如单词或类别&#xff09;映射到连续的向量空间&#xff0c;从而实现数据的降维或升维。 在降维方面&…

【SAR成像】基于RD、CS和ωk算法的合成孔径雷达成像算法原理与实现

基于RD、CS和ωk算法的合成孔径雷达成像算法实现 前言SAR基本概念雷达获取数据的几何关系低斜视角下的回波信号模型 RADARSAT-1主要参数数据预处理数据读取与再封装数据补零 成像算法坐标轴的产生RD算法距离压缩距离徙动矫正方位压缩 CS算法第一次相位相乘 变标后的信号第二次相…

Qt应用软件【协议篇】http协议get、post示例

文章目录 QT Http的APIHTTP GET 请求示例HTTP POST 请求示例伪装chrome浏览器get请求 QT Http的API QNetworkAccessManager 作用&#xff1a;管理所有的网络请求&#xff0c;是发送请求和接收响应的中心点。主要功能&#xff1a; 发送HTTP请求&#xff08;GET, POST, PUT, DE…

基于若依的ruoyi-nbcio流程管理系统自定义业务实现一种简单的动态任务标题需求

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

[Android] 240204批量生成联系人,短信,通话记录的APK

平常在做测试的时候&#xff0c;需要批量生成很多测试数据&#xff1b; 陌生人 联系人名字的生成支持随机生成&#xff0c;也可以自定义生成&#xff0c;自定义生成陌生人的数据&#xff0c;联系人的名字是否带索引&#xff1b; 通话记录 随机生成通话记录&#xff0c;在生…

云数据库RDS云监控

1. 什么是云数据库RDS&#xff1f;它有哪些特点&#xff1f; 云数据库RDS是一种在线关系型数据库服务&#xff0c;它具备的特点包括&#xff1a; 安全可靠&#xff1a;提供了容灾、备份、恢复等高可用性功能&#xff0c;确保数据的安全与可靠。弹性伸缩&#xff1a;用户可以根…

free5GC+UERANSIM

使用arp、ifconfig、docker inspect及网桥brctl 相关命令&#xff0c;收集容器IP及Mac地址相关信息&#xff0c;可以梳理出UERANSIMfree5GC模拟环境组网&#xff0c;如下图所示&#xff1a; 如上图所示&#xff1a;环境基于ubuntu 18.04 VMware虚机部署&#xff0c;5GC网元分别…

【React】memo()、useCallback()、useMemo()的区别及使用场景

介绍React中三个hooks方法memo useCallback useMemo的作用及使用场景示例 一、React.memo()&#xff1a;用来控制函数组件的重新渲染&#xff0c;将组件作为参数&#xff0c;函数的返回值是一个新的组件。二、React.useCallback()&#xff1a;将回调函数及依赖项数组作为参数传…

【Python】Unindent does not match any outer indentation level

这个问题一般是代码缩进问题导致的&#xff0c;规范代码缩进格式即可&#xff0c;如图&#xff1a; 这个问题是因为报异常的那行代码下的方法缩进问题导致&#xff0c;def calendar_f(): 方法名前面多了一个空格。 删除空格即可解决此问题。

【python】python爱心代码【附源码】

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码&#xff1a; import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…

Fink CDC数据同步(五)Kafka数据同步Hive

6、Kafka同步到Hive 6.1 建映射表 通过flink sql client 建Kafka topic的映射表 CREATE TABLE kafka_user_topic(id int,name string,birth string,gender string ) WITH (connector kafka,topic flink-cdc-user,properties.bootstrap.servers 192.168.0.4:6668…

iview 页面中判断溢出才使用Tooltip组件

使用方法 <TextTooltip :content"contentValue"></TextTooltip> 给Tooltip再包装一下 <template><Tooltip transfer :content"content" :theme"theme" :disabled"!showTooltip" :max-width"300" :p…

滴滴面经相关知识整理(基于newbing)

Vue2和Vue3有许多不同之处&#xff0c;以下是一些主要的区别&#xff1a; 数据劫持方式&#xff1a;Vue2主要是通过Object.defineProperty劫持数据&#xff0c;对于新增的对象属性&#xff0c;使用数组修改元素&#xff0c;视图无法更新1。 性能和体积&#xff1a;Vue3的运行速…

Spring auto-configuration的使用

简介 在构建Maven项目时&#xff0c;使用Spring Boot自动配置可以使项目更易于集成和使用。本文将向您展示如何创建一个Maven项目&#xff0c;并使用Spring Boot自动配置使其能够被其他组件方便地依赖。 步骤 1. 添加Spring Boot Starter依赖 确保您的Maven项目具有必要的S…

跟着cherno手搓游戏引擎【20】混合(blend)

抽象&#xff1a; Renderer.h: #pragma once #include"RenderCommand.h" #include "OrthographicCamera.h" #include"Shader.h" namespace YOTO {class Renderer {public:static void Init();static void BeginScene(OrthographicCamera& …

天拓四方:边缘计算网关功能、特点与应用举例

传统的数据处理方式面临网络延迟、带宽限制和安全风险等问题。为了解决这些问题&#xff0c;边缘计算技术应运而生&#xff0c;而边缘计算网关作为其核心组件&#xff0c;正发挥着越来越重要的作用。边缘计算网关位于数据源和云数据中心之间。它具备数据采集、协议转换、数据处…