【堆】Leetcode 347. 前 K 个高频元素【中等】

ops/2025/3/21 0:32:11/

前 K 个高频元素

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

示例 1:

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

解题思路

  • 1、使用哈希表来统计数组中每个元素的出现频率。
  • 2、使用最小堆(MinHeap)来找到出现频率前k高的元素。
  • 3、遍历哈希表中的每个元素,将元素和其频率插入最小堆中:
  •  如果堆的大小小于k,将当前元素插入堆中;
    
  •  如果堆的大小已经达到k,且当前元素的频率大于堆顶元素的频率,则弹出堆顶元素并将当前元素插入堆中。
    
  • 4、最终堆中的元素即为出现频率前k高的元素。

Java实现

public class TopKFrequentElements {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<Integer> minHeap = new PriorityQueue<>(Comparator.comparingInt(freqMap::get));for (int num : freqMap.keySet()) {minHeap.offer(num);if (minHeap.size() > k) {minHeap.poll();}}// 将堆中的元素转换为数组返回int[] result = new int[k];for (int i = k - 1; i >= 0; i--) {result[i] = minHeap.poll();}return result;}public static void main(String[] args) {TopKFrequentElements solution = new TopKFrequentElements();int[] nums = {1, 2, 1, 2, 4, 3,3,1,4,2,1};int k = 2;int[] topKElements = solution.topKFrequent(nums, k);System.out.println("Top " + k + " frequent elements: " + Arrays.toString(topKElements)); // Output: [1, 2]}
}

时间空间复杂度

时间复杂度:统计频率的时间复杂度为O(n),构建最小堆的时间复杂度为O(k log k),总时间复杂度为O(n + k log k)。(k->n时,时间复杂度O(nlogn))

空间复杂度:哈希表和最小堆各需要O(n)的额外空间。


http://www.ppmy.cn/ops/15029.html

相关文章

阿里云难题学习笔记

1、下列内存区段增长方是向低地址方向的有&#xff08; &#xff09;&#xff1f; A: 文本段 B: 数据段 C: 堆区 D: 栈区 解析&#xff1a; 在内存管理中&#xff0c;不同的内存区段增长方向是不同的。栈区&#xff08;Stack&#xff09;的增长方向是向低地址方向的&…

Web集群_02

Web集群_01 Keepalived 概述 Keepalived实现了高可用集群 Keepalived最初是为LVS设计 , 专门监控各种服务器节点的状态 Keepalived 后加入了 VRRP 功能 , 防止单点故障 VRRP ( 虚拟冗余路由协议 ) VRRP能在不改变网组的情况下 , 将多台路由器虚拟成一个虚拟路由器 , 通过配…

书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)

书生浦语大模型实战营之Llama 3 高效部署实践&#xff08;LMDeploy 版&#xff09; 环境&#xff0c;模型准备LMDeploy chatTurmind和Transformer的速度对比LMDeploy模型量化(lite)LMDeploy服务(serve) 环境&#xff0c;模型准备 InternStudio 可以直接使用 studio-conda -t …

Golang实现一个批量自动化执行树莓派指令的软件(3)下载

简介 话接上篇 Golang实现一个批量自动化执行树莓派指令的软件(2)指令&#xff0c; 这次实现文件的下载。 环境描述 运行环境: Windows&#xff0c; 基于Golang&#xff0c; 暂时没有使用什么不可跨平台接口&#xff0c; 理论上支持Linux/MacOS 目标终端&#xff1a;树莓派Debi…

【 Vue 路由 跳转 路由守卫 】

Vue Router replace 编程式导航缓存路由组件 路由跳转的replace方法 作用:控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式&#xff1a;push 和 replacereplace是替换当前记录&#xff0c;路由跳转时候默认为push方式 replace 标签写法 &#xff1a; &…

【每日一题】2007. 从双倍数组中还原原数组-2024.4.18

题目&#xff1a; 2007. 从双倍数组中还原原数组 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 2 加入数组中&#xff0c;然后将所有元素 随机打乱 。 给你一个数组 changed &#xff0c;如果 change 是 双…

Linux常用命令总结(四):文件权限及相关命令介绍

1. 文件属性信息解读 1. 文件类型和权限的表示 0首位表示类型。在Linux中第一个字符代表这个文件是目录、文件或链接文件 符号对应文件类型-代表文件dd 代表目录l链接文档(link file)&#xff1b; 1-3位确定属主&#xff08;该文件的所有者&#xff09;拥有该文件的权限。 4-6…

处理突发事件—中断

中断是计算机操作系统中用来处理突发事件的一种机制&#xff0c;它允许CPU在执行正常程序流程时暂时停下来&#xff0c;去处理更紧急的任务&#xff0c;处理完成后再恢复原来的任务。中断是现代计算机系统中不可或缺的组成部分&#xff0c;它提高了系统的效率和响应性。 中断的…