2025年- H65-Lc173--347.前k個高頻元素(小根堆,堆頂元素是當前堆元素里面最小的)--Java版

1.題目描述

在這里插入圖片描述

2.思路

在這里插入圖片描述
在這里插入圖片描述
(1)這里定義了一個小根堆(最小堆),根據元素的頻率從小到大排序。小根堆原理:堆頂是最小值,每次插入或刪除操作會保持堆的有序結構(常用二叉堆實現)。
比如,map.get(a) - map.get(b) 表示:
頻率小的排在堆頂;
當堆滿 k 個元素后,就可以比較新元素與堆頂的大小,進行替換。

(2)這個循環遍歷 map 中的所有 key,目的是找出頻率前 k 高的元素。

如果堆還沒滿,直接加入;
如果堆滿了,比較當前元素的頻率和堆頂元素頻率:
當前元素更高,則替換堆頂。
繼續例子(k = 2)
map: {1=3, 2=2, 3=1}
按順序加入:
加入 1,堆 = [1]
加入 2,堆 = [1, 2](根據頻率排序,2 的頻率低,堆頂是 2)
處理 3(頻率 1):
頻率小于堆頂 2 → 不加入
最終堆中是 [1, 2]
在這里插入圖片描述

🧩 舉個例子來直觀理解:
(1)輸入:nums = [1, 1, 1, 2, 2, 3],k = 2
(2)頻率統計結果:map = {1=3, 2=2, 3=1}
維護一個小根堆 pq,大小最多為 2(k=2):
加入 1(頻率3)→ pq = [1]
加入 2(頻率2)→ pq = [2, 1](按頻率排序,堆頂是頻率最小的)
嘗試加入 3(頻率1):
頻率 1 < 堆頂 2 的頻率 ? 不加入
現在 pq 中是 [2, 1],是頻率前 2 高的元素!
取出堆中元素:
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = pq.remove(); // remove 堆頂元素
}
return result;
雖然 remove() 是按頻率從小到大彈出,但我們關心的是內容是這 k 個元素本身是否是頻率最高的
它不保證從大到小的順序(如果你想要排好順序,可以再排序)
總結這段邏輯:
小根堆始終維護的是「當前頻率最高的前 k 個元素」;

取出這些元素即可完成任務;

堆頂是這 k 個元素中最小的,所以我們才用小根堆。

3.代碼實現

class Solution {public int[] topKFrequent(int[] nums, int k) {//使用字典,統計每個元素出現的次數,元素為鍵,元素出現的次數為值HashMap<Integer, Integer> map = new HashMap<>();for (int num : nums) {if(map.containsKey(num)){//如果字典元素在后續遍歷的過程中又再次出現,直接次數+1map.put(num, map.get(num) + 1);}else{//如果該字典元素是首次出現。map.put(num, 1);}}//遍歷map,用最小堆保存頻率最大的k個元素//優先級隊列的底層原理就是堆PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {public int compare(Integer a, Integer b) {return map.get(a) - map.get(b);  // 出現次數小的排前面(小根堆)}});// 遍歷 map 的 key 值for (Integer key : map.keySet()) {if (pq.size() < k) {pq.add(key);  // 隊列還未滿,直接加入} else if (map.get(key) > map.get(pq.peek())) {pq.remove();      // 彈出堆頂元素(頻率最小)pq.add(key);      // 加入當前頻率更高的元素}}//取出最小堆的元素int[] result=new int[k];for(int i=0;i<k;i++){result[i]=pq.remove();}return result;//pq.remove() 會返回堆頂元素,并從堆中刪除該元素;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908314.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VR/AR 顯示瓶頸將破!鐵電液晶技術迎來關鍵突破

在 VR/AR 設備逐漸走進大眾生活的今天&#xff0c;顯示效果卻始終是制約其發展的一大痛點。紗窗效應、畫面拖影、眩暈感…… 傳統液晶技術的瓶頸讓用戶體驗大打折扣。不過&#xff0c;隨著鐵電液晶技術的重大突破&#xff0c;這一局面有望得到徹底改變。 一、傳統液晶技術瓶頸…

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的時候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自帶為9.50 然后使用ocrmypdf報錯了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不夠安裝的版本為9.50不夠&#xff0c;因此去官網https://ghostscript.c…

【TinyWebServer】線程同步封裝

目錄 POSIX信號量 int sem_init(sem_t* sem,int pshared,unsingned int value); int sem_destroy(sem_t* sem); int sem_wait(sem_t* sem); int sem_post(sem_t* sem); 互斥量 條件變量 為了對多線程程序實現同步問題&#xff0c;可以用信號量POSIX信號量、互斥量、條件變…

打造高效多模態RAG系統:原理與評測方法詳解

引言 隨著信息檢索與生成式AI的深度融合&#xff0c;檢索增強生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 已成為AI領域的重要技術方向。傳統RAG系統主要依賴文本數據&#xff0c;但真實世界中的信息往往包含圖像、表格等多模態內容。多模態RAG&#xf…

Unity安卓平臺開發,啟動app并傳參

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 檢查是否有傳…

云計算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】

云計算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】 目錄 云計算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】1.RPM包的一般安裝位置2.軟件名和軟件包名3.查詢軟件信息4.查詢軟件包5.導入紅帽簽名信息&#xff0c;解決查詢軟件包信息報錯6.利用…

【圖像處理3D】:點云圖是怎么生成的

點云圖是怎么生成的 **一、點云數據的采集方式****1. 激光雷達&#xff08;LiDAR&#xff09;****2. 結構光&#xff08;Structured Light&#xff09;****3. 雙目視覺&#xff08;Stereo Vision&#xff09;****4. 飛行時間相機&#xff08;ToF Camera&#xff09;****5. 其他…

javaweb -html -CSS

HTML是一種超文本標記語言 超文本&#xff1a;超過了文本的限制&#xff0c;比普通文本更強大&#xff0c;除了文字信息&#xff0c;還可以定義圖片、音頻、視頻等內容。 標記語言&#xff1a;由標簽"<標簽名>"構成的語言。 CSS:層疊樣式表&#xff0c;用于…

pyinstaller 安裝 ubuntu

安裝命令 pip install pyinstaller 讀取安裝路徑 ? ~ find ~/.local/ -name pyinstaller/home/XXX/.local/bin/pyinstaller 路徑配置 vi ~/.zshrc 添加到文件最后 export PATH"$PATH:/home/XXX/.local/bin/" 查看版本號 ? ~ source ~/.zshrc? ~ pyi…

【前端】掌握HTML/CSS寬高調整:抓住問題根源,掌握黃金法則

一、寬高控制的「黃金法則」 問題根源&#xff1a;為什么設置了寬高沒效果&#xff1f; <!-- 典型失敗案例 --> <style>.problem-box {width: 200px;height: 100px;padding: 20px; /* 實際變成240x140px&#xff01; */border: 5px solid red; /* 最終250x150px&…

LuaJIT2.1 和 Lua5.4.8 性能對比

說明 最近在學習 LuaJIT&#xff0c;想看看把它接入到項目中使用&#xff0c;會提高多大的性能。 今天抽時間&#xff0c;簡單地測試了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 測試平臺&#xff1a; 系統&#xff1a;Windows 10 WSLCPU&#xff1a;Intel Core? i7-8700 CPU…

Arduino學習-按鍵燈

哎&#xff0c;別笑&#xff0c;總比刷抖音強點吧 1、效果 2、代碼 const int buttonPin2; const int ledPin13;int buttonState0;void setup() {// put your setup code here, to run once:pinMode(buttonPin,INPUT);pinMode(ledPin,OUTPUT); }void loop() {// put your mai…

強化學習魚書(10)——更多深度強化學習的算法

&#xff1a;是否使用環境模型&#xff08;狀態遷移函數P(s’|s,a)和獎 勵函數r(s&#xff0c;a&#xff0c;V)&#xff09;。不使用環境模型的方法叫作無模型&#xff08;model-free&#xff09;的方法&#xff0c;使用環境模型的方法叫作有模型&#xff08;model-based&#…

9.axios底層原理,和promise的對比(2)

&#x1f63a;&#x1f63a;&#x1f63a; 和promise的對比 完全可以直接使用 Promise 來發 HTTP 請求&#xff0c;比如用原生 fetch Promise 就可以實現網絡請求功能&#x1f447; ? 用 Promise fetch 的寫法&#xff08;原生&#xff09; fetch(‘https://api.example.c…

什么是數據孤島?如何實現從數據孤島到數據共享?

目錄 一、數據孤島是什么&#xff1f; &#xff08;一&#xff09;數據孤島的定義 &#xff08;二&#xff09;數據孤島怎么形成的 二、數據孤島帶來的問題 &#xff08;一&#xff09;數據冗余和不一致 &#xff08;二&#xff09;決策效率低下 &#xff08;三&#xf…

MQTT入門實戰寶典:從零起步掌握物聯網核心通信協議

MQTT入門實戰寶典&#xff1a;從零起步掌握物聯網核心通信協議 前言 物聯網時代&#xff0c;萬物互聯已成為現實&#xff0c;而MQTT協議作為這個時代的"數據總線"&#xff0c;正默默支撐著從智能家居到工業物聯的各類應用場景。本文將帶你揭開MQTT的神秘面紗&#…

I2C通信講解

I2C總線發展史 怎么在一條串口線上連接多個設備呢&#xff1f; 由于速度同步線是由主機實時發出的&#xff0c;所以主機可以按需求修改通信速度&#xff0c;這樣在一條線上可以掛接不同速度的器件&#xff0c;單片機和性能差的器件通信&#xff0c;就輸出較慢的脈沖信號&#x…

Windows 10 IoT 系統深度定制指南:從環境搭建到工業部署

目錄 一、Windows 10 IoT 架構特性與版本選型 1.1 核心架構設計 1.2 版本對比與選型建議 二、開發環境搭建與硬件適配 2.1 工具鏈配置 2.2 硬件適配關鍵步驟 三、系統定制流程詳解 3.1 鏡像定制&#xff08;IoT Core Dashboard&#xff09; 3.2 使用ICD&#xff08;Im…

k8s開發webhook使用certmanager生成證書

1.創建 Issuer apiVersion: cert-manager.io/v1 kind: Issuer metadata:name: selfsigned-issuernamespace: default spec:selfSigned: {}2.Certificate&#xff08;自動生成 TLS 證書&#xff09; apiVersion: cert-manager.io/v1 kind: Certificate metadata:name: webhook…

MyBatis-Plus深度全解:從入門到企業級實戰

MyBatis-Plus深度全解&#xff1a;從入門到企業級實戰 一、為什么選擇MyBatis-Plus&#xff1f; 1.1 MyBatis的痛點 - 重復CRUD代碼編寫 - 分頁功能實現復雜 - 缺少通用Service層封裝 - 動態表名支持困難 - 多租戶方案需自行實現1.2 MyBatis-Plus核心優勢 無侵入&#xff1a…