【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)

🚀 力扣热题 347:前 K 个高频元素(详细解析)

📌 题目描述

力扣 347. 前 K 个高频元素

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

🎯 示例 1:

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

🎯 示例 2:

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

💡 解题思路

本题考察 高频元素统计,涉及 哈希表堆(优先队列) 的应用。我们可以采用以下方法解决:

✅ 方法 1:哈希表 + 小顶堆(推荐,适用于大数据)

思路:

  1. 使用哈希表 统计每个元素的出现次数。
  2. 使用小顶堆(优先队列) 维护前 k 个高频元素,堆的大小保持在 k
  3. 遍历哈希表,将元素插入小顶堆:
    • 如果堆的大小小于 k,直接插入。
    • 如果堆的大小等于 k,比较新元素与堆顶元素的频率,若更大则替换堆顶。

⏳ 时间复杂度分析:

  • 统计频率:O(n)
  • 堆操作:O(n log k)
  • 最终取出 k 个元素:O(k log k)
  • 总复杂度:O(n log k),适用于大规模数据。

💻 Go 实现(小顶堆)

import ("container/heap"
)type Pair struct {num  intfreq int
}type MinHeap []Pairfunc (h MinHeap) Len() int            { return len(h) }
func (h MinHeap) Less(i, j int) bool  { return h[i].freq < h[j].freq } // 小顶堆
func (h MinHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
func (h *MinHeap) Push(x interface{}) { *h = append(*h, x.(Pair)) }
func (h *MinHeap) Pop() interface{} {old := *hn := len(old)item := old[n-1]*h = old[:n-1]return item
}func topKFrequent(nums []int, k int) []int {freqMap := make(map[int]int)for _, num := range nums {freqMap[num]++}h := &MinHeap{}heap.Init(h)for num, freq := range freqMap {heap.Push(h, Pair{num, freq})if h.Len() > k {heap.Pop(h) // 保持堆大小为 k}}result := make([]int, k)for i := 0; i < k; i++ {result[i] = heap.Pop(h).(Pair).num}return result
}

✅ 方法 2:哈希表 + 快排(适用于小规模数据)

思路:

  1. 哈希表统计频率:O(n)
  2. 转化为切片后按频率排序:O(n log n)
  3. 取前 k 个元素:O(k)

⏳ 时间复杂度分析:

  • 总复杂度:O(n log n)
  • 适用于数据量较小的场景

💻 Go 实现(快速排序)

import "sort"func topKFrequentQuickSort(nums []int, k int) []int {freqMap := make(map[int]int)for _, num := range nums {freqMap[num]++}freqArr := make([][2]int, 0, len(freqMap))for num, freq := range freqMap {freqArr = append(freqArr, [2]int{num, freq})}sort.Slice(freqArr, func(i, j int) bool {return freqArr[i][1] > freqArr[j][1]})result := make([]int, k)for i := 0; i < k; i++ {result[i] = freqArr[i][0]}return result
}

是的,可以补充 桶排序(Bucket Sort) 作为另一种解法。桶排序适用于 元素范围较小 的情况,能够在 O(n) 线性时间内找到前 K 个高频元素。


方法 3:桶排序(Bucket Sort)

💡 思路

  1. 哈希表统计频率:用 map[int]int 统计每个元素的出现次数。
  2. 构建桶数组:创建 buckets 数组,其中索引代表元素的频率,索引值存储对应的数字。
  3. 从高频向低频遍历桶,找到前 K 个元素。

时间复杂度分析

操作复杂度
统计频率O(n)
分配到桶O(n)
遍历桶O(n)
总复杂度O(n)

💻 Go 代码实现

func topKFrequentBucketSort(nums []int, k int) []int {freqMap := make(map[int]int)for _, num := range nums {freqMap[num]++}// 创建桶,索引代表频率,存储出现该频率的数n := len(nums)buckets := make([][]int, n+1) for num, freq := range freqMap {buckets[freq] = append(buckets[freq], num)}// 逆序遍历桶,找到前 K 个高频元素result := []int{}for i := n; i > 0 && len(result) < k; i-- {if len(buckets[i]) > 0 {result = append(result, buckets[i]...)}}return result[:k] // 只返回前 k 个元素
}

🔥 方法对比总结

方法时间复杂度适用场景备注
哈希表 + 小顶堆O(n log k)n 很大,k 很小适用于 大规模数据
哈希表 + 快速排序O(n log n)n 较小,适用于静态数据代码较简洁
哈希表 + 桶排序O(n)n 适中,元素范围小适用于 频率较分散的情况

🎯 总结

  • 堆排序 适用于 大数据流处理,时间复杂度 O(n log k),使用 优先队列(最小堆)
  • 快速排序 适用于 静态数据排序,时间复杂度 O(n log n),代码较简洁。
  • 桶排序 适用于 元素范围小且频率分散 的情况,时间复杂度 O(n),是 最快的方法 之一。

💡 如果觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐、关注 💻,持续分享更多高质量算法题解析!🎯🚀📌

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

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

相关文章

Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价中的创新方法与实践(166)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

深度学习入门:从神经网络基础到简单实现

深度学习作为人工智能领域最令人兴奋的技术之一,已经在图像识别、自然语言处理、语音识别等多个领域取得了突破性进展。本文将深入浅出地介绍深度学习的基本概念,并通过Python代码实现一个简单的神经网络模型,帮助读者建立直观理解并迈出实践第一步。 神经网络的基本原理 …

第2.6节 iOS生成全量和增量报告

2.6.1 简介 在采集了覆盖率数据后&#xff0c;就需要生成对应需求的全量和增量覆盖率报告&#xff0c;以便对测试进行查漏补缺。IOS系统有两种开发语言&#xff0c;所以生成报告的方式也不相同&#xff0c;下面就分别介绍一下Object C和Swift语言如何生成覆盖率报告。 2.6.2 O…

STM32技能综合巩固

一、深入理解ARMCPU架构及其指令格式、ARM汇编语言编程方法 1.汇编语言编程&#xff0c;实现LED灯 新建keil项目&#xff0c;选择芯片 选择运行环境以及配置 添加.s文件 汇编程序&#xff1a; AREAMYDATA,DATA AREAMYCODE,CODE ENTRY EXPORT__main __main MOVR0,#10 M…

P2Rank网页端:预测蛋白结合口袋+vina分子对接

P2Rank 是一种基于机器学习的蛋白质口袋预测工具&#xff0c;用于识别蛋白质结构中的潜在配体结合位点。它采用了一种基于物理特征的打分方法&#xff0c;结合随机森林&#xff08;Random Forest&#xff09;机器学习模型&#xff0c;以提高口袋预测的精确度。 该程序有在线工具…

安装windows server 2016没有可选硬盘,设备安装过ubuntu系统

如果在安装 Windows Server 2016 时无法识别已安装过 Ubuntu 的硬盘&#xff0c;可能是由于硬盘分区格式&#xff08;如 ext4&#xff09;与 Windows 不兼容&#xff0c;或缺少必要的驱动程序。以下是详细的解决方案&#xff1a; 1. 检查 BIOS/UEFI 设置 确认硬盘模式 • 重启电…

Debian系统_主板四个网口1个配置为WAN,3个配置为LAN

Debian系统_主板四个网口1个配置为WAN&#xff0c;3个配置为LAN 一、重新配置网口 1、查看当前网口的状态 ifconfig 或者 ip link show 或者 ls /sys/class/net 2、修改网络配置文件 sudo vi /etc/network/interfaces 注意WAN口的网关地址如果是192.168.3.1的话&#xff0c;L…

springboot整合Thymeleaf web开发出现Whitelabel Error Page

背景 在做java端上应用开发的时候&#xff0c;从资源和部署操作成本两方面考虑&#xff0c;一般会将前端的静态资源直接与后端应用一起打包&#xff0c;通过springboot内嵌的Tomcat提供web服务。进入web首页登录一直到后续业务流程正向操作&#xff0c;页面都能正常加载静态资…

JavaScript元素尺寸与位置

目录 client 家族与 offset 家族 一、client 家族&#xff1a;内容区域 内边距 示例代码 应用场景 二、offset 家族&#xff1a;内容区域 内边距 边框 滚动条 示例代码 应用场景 三、综合应用场景 1. 动态调整元素高度 2. 拖拽元素 3. 判断元素是否在视口内 四…

GZ073网络系统管理赛项赛题第1套模块A:网络构建解题笔记

2. 设备 接口或VLAN VLAN名称 二层或三层规划 说明 S1 VLAN10 CAIWU Gi0/1至Gi0/4 财务部 VLAN20 XIAOSHOU Gi0/5至Gi0/8 销售部 VLAN30 YANFA Gi0/9至Gi0/12 研发部 VLAN40 SHICHANG Gi0/13至Gi0/16 市场部 VLAN50 AP Gi0/20至Gi0/21 无线AP管理 VL…

jmeter web压力测试 压测

下载地址 Apache JMeter - Download Apache JMeter 1. 设置线程组 2. 设置http请求头 3. 设置http请求体 4. 设置结果条目 常用函数 ${__RandomString(8, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789)}${__javaScript( ${__Random(1000, 10000)} /…

大语言模型(LLM)应用开篇 | RAG方法论概述 | 构建知识库探索

大型语言模型应用开篇 | RAG技术 | 构建知识库探索 1、大语言模型&#xff08;LLM&#xff09;应用开篇2、RAG技术2.1 基于RAG实现知识库问答系统的基本步骤2.2 RAG与其他技术的关系与区别 1、大语言模型&#xff08;LLM&#xff09;应用开篇 现在是2025年&#xff0c;DeepSeek…

fbx bip互转 测试OK

目录 fbx bip互转 3dmax插件fbx转bip: 测试可以转: MotionBuilder fbx转bip fbx bip互转 3dmax插件fbx转bip: 测试可以转: 不用插件!!无脑把Mxiamo转bip骨骼动画 - CG软件插件脚本交流 - Powered by Discuz!

8个实用销售工具

CRM系统&#xff08;客户关系管理系统&#xff09; 特点&#xff1a;能集中管理客户信息&#xff0c;如联系方式、交易记录、偏好等&#xff0c;还可对销售流程进行自动化管理。 用途&#xff1a;帮助销售团队跟踪客户&#xff0c;分析客户行为&#xff0c;预测销售趋势&am…

【家政平台开发(6)】筑牢家政平台安全防线:全方位隐私与安全需求解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析&#xff0c;剖析家政行业现状、挖掘用户需求与梳理功能要点&#xff0c;到系统设计阶段的架构选型、数据库构建&#xff0c;再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化…

IP 地址规划中的子网划分:/18 网络容纳 64 个 C 段(/24)的原理与应用解析

整体表格说明 这是某市教育城域网中某县教育相关机构的IP地址规划表&#xff0c;明确了某县一中和某县教育局的IP地址范围&#xff0c;包括终端使用地址段、业务互访地址段。 概念解析 64个C段终端及互联地址 C段地址&#xff1a;一个C段是IP地址中的一个/24网络&#xff08;…

python生成并绘制各种类型声音噪声

python生成并绘制各种类型声音噪声 1、效果 白噪声: 工业设备振动噪声: 2、噪声类型 主要噪声类型有: 白噪声:全频段能量均匀分布 直接生成高斯分布随机数粉红噪声:能量随频率增加按1/f衰减(适合声学测试) 使用IIR滤波器对白噪声进行滤波处理布朗噪声:能量随频率增加…

软考-数据库系统工程师第四版pdf

软考-数据库系统工程师第四版pdf git中的文件相对没有那么清楚&#xff0c;网盘的有高清版 github下载 这里我给出仓库地址 链接: https://github.com/yaodada123/ruankao-pdf https://github.com/yaodada123/ruankao-pdf gitee下载 https://gitee.com/yao-hengchao/ruank…

Linux(24)——系统调优

目录 一、tuned 软件包&#xff1a; 1、安装并启用 tuned &#xff1a; 2、验证 tuned 软件包&#xff1a; &#xff08;1&#xff09;是否安装&#xff1a; &#xff08;2&#xff09;是否启用&#xff1a; &#xff08;3&#xff09;是否正在运行&#xff1a; 二、系统…

文件系统--软硬链接/动静态库

inode 是文件系统中的一个重要概念&#xff0c;用于存储文件的元数据。 inode 的结构和内容 文件权限&#xff1a;定义了文件所有者、所属组以及其他用户对文件的读、写、执行权限。文件所有者和所属组&#xff1a;记录了文件的所有者和所属的用户组信息。文件大小&#xff1…