leetcode hot100【LeetCode 347.前 K 个高频元素】java实现

news/2024/11/28 16:37:51/

LeetCode 347.前 K 个高频元素

题目描述

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

Java 实现代码

java">class Solution {public int[] topKFrequent(int[] nums, int k) {// 统计每个元素的频率Map<Integer, Integer> freqMap = new HashMap<>();for (int num : nums) {freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);}// 使用一个最小堆(优先队列)来存储频率前 k 大的元素PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>((a, b) -> a.getValue() - b.getValue());// 保持堆的大小为 kfor (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) {minHeap.offer(entry);if (minHeap.size() > k) {minHeap.poll(); // 移除堆顶元素}}// 提取堆中的元素,得到结果int[] result = new int[k];int index = 0;while (!minHeap.isEmpty()) {result[index++] = minHeap.poll().getKey();}return result;}
}

解题思路

  1. 统计元素频率 首先,我们需要统计数组中每个元素的出现频率。我们可以使用一个哈希表(Map<Integer, Integer>)来记录每个元素及其频率。

  2. 使用最小堆 为了高效地找到前 k 个高频元素,我们可以使用一个最小堆(PriorityQueue)。

    • 插入元素时,堆中的大小会保持为 k,若堆中的元素超过 k 个,则移除堆顶元素(即当前频率最小的元素)。
    • 通过最小堆的性质,最终堆顶元素就是频率最小的那一个。
  3. 返回结果 最后,将堆中的元素提取出来,得到前 k 个高频元素。

复杂度分析

  • 时间复杂度O(n log k)
  • 空间复杂度O(n + k)

http://www.ppmy.cn/news/1550669.html

相关文章

QT 中 SQLite 使用方法

一、pro文件中包含&#xff1a; QT ... sql 二、SQLite 使用要包含的头文件&#xff1a; #include <QSqlDatabase> // 数据库驱动 #include <QSqlQuery> // 数据库执行语句 #include <QSqlError> // 数据库日志 三、数据库创建 QSqlDatabase dat…

【CLIP】2: semantic-text2image-search前后端调试

添加了详细的调试信息,包括当前处理的图片、向量化结果,以及插入到集合中的数据详情。调试信息可以帮助你在运行过程中清楚地了解数据的处理情况。调试建议 向量维度和内容:通过打印向量的长度和部分内容,可以检查向量化过程是否正常。处理失败时的日志:捕获异常时记录具体…

LeetCode 3243. Shortest Distance After Road Addition Queries I

&#x1f517; https://leetcode.com/problems/shortest-distance-after-road-addition-queries-i 题目 有 n 个城市&#xff0c;编号 0 ~ n-1&#xff0c;从城市 i 到 i1 有一条路给若干高速路&#xff0c;表明从城市 u 到 v 有一条新增的路&#xff0c;v - u > 1返回每新…

泷羽sec学习打卡-shell命令2

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell2 临时变量和永久变量为什么使用ls、dir命令可以输出一些内容呢&#xff1f;如…

Milvus实操

概念 Milvus 关键概念优化笔记 Milvus 是一个高性能、可扩展的开源向量数据库&#xff0c;专为处理海量向量数据和执行相似性搜索而设计。以下是 Milvus 中的一些核心概念及其详细解释。 1. 集合&#xff08;Collection&#xff09; 定义&#xff1a; 集合是 Milvus 中存储向…

如何分析Windows防火墙日志

Windows防火墙&#xff0c;也被称为Windows Defender Firewall&#xff0c;是一种内置的安全功能&#xff0c;可以主动监控和分析运行Windows操作系统的计算机上通过Windows防火墙的网络流量&#xff0c;主要目的是作为计算机和互联网或其他网络之间的屏障&#xff0c;使管理员…

python计算stable-diffusion-1.5模型参数量以及该模型每一层网络的参数量【其他LLM模型也有参考意义】

最近在计算stable-diffusion-1.5模型参数量上花了点心思&#xff0c;总结了一些方法&#xff0c;一起学习&#xff1a; stable-diffusion-1.5模型结构 首先stable-diffusion-1.5模型主要有三个关键组件&#xff08;text_encoder,unet,vae&#xff09;&#xff0c;关于stable-…

【NLP 2、机器学习简介】

人生的苦难不过伏尔加河上的纤夫 —— 24.11.27 一、机器学习起源 机器学习的本质 —— 找规律 通过一定量的训练样本找到这些数据样本中所蕴含的规律 规律愈发复杂&#xff0c;机器学习就是在其中找到这些的规律&#xff0c;挖掘规律建立一个公式&#xff0c;导致对陌生的数…