【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.pswp.cn/pingmian/74221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/74221.shtml
英文地址,請注明出處:http://en.pswp.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…