力扣top100(day04-05)--堆

本文為力扣TOP100刷題筆記

筆者根據數據結構理論加上最近刷題整理了一套 數據結構理論加常用方法以下為該文章:

力扣外傳之數據結構(一篇文章搞定數據結構)

215. 數組中的第K個最大元素

class Solution {// 快速選擇遞歸函數int quickselect(int[] nums, int l, int r, int k) {if (l == r) return nums[k];  // 基準情況:區間只有一個元素// 選取基準值(這里簡單選擇最左邊的元素)int x = nums[l], i = l - 1, j = r + 1;// 分區操作while (i < j) {// 從左找第一個大于等于x的元素do i++; while (nums[i] < x);// 從右找第一個小于等于x的元素do j--; while (nums[j] > x);// 交換這兩個元素if (i < j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}// 遞歸處理包含第k元素的子區間if (k <= j) return quickselect(nums, l, j, k);else return quickselect(nums, j + 1, r, k);}public int findKthLargest(int[] _nums, int k) {int n = _nums.length;// 將問題轉化為找第n-k小的元素(即第k大的元素)return quickselect(_nums, 0, n - 1, n - k);}
}

算法步驟

  1. 分區(Partition)

    • 選擇一個基準值(pivot)x(這里選擇最左邊的元素nums[l]

    • 使用兩個指針ij

      • i從左向右找第一個≥x的元素

      • j從右向左找第一個≤x的元素

      • 交換這兩個元素,直到ij相遇

  2. 遞歸選擇

    • 根據k的位置決定遞歸處理左半部分還是右半部分

    • 如果k在左半部分(k <= j),繼續處理左半部分

    • 否則處理右半部分

  3. 轉換問題

    • 第k大的元素 = 第(n-k)小的元素(n - k

示例演示

假設輸入數組為[3,2,1,5,6,4]k = 2(找第2大的元素):

  1. n = 6,轉換為找第4小的元素(n - k = 4

  2. 初始調用quickselect(nums, 0, 5, 4)

  3. 分區過程:

    • 基準值x = 3

    • i找到5,j找到1

    • 交換后數組變為[3,2,1,4,6,5]

    • j停在索引2

  4. 因為4 > 2,遞歸處理右半部分quickselect(nums, 3, 5, 4)

  5. 再次分區:

    • 基準值x = 4

    • i找到6,j找到4

    • 交換后數組不變

    • j停在索引3

  6. 因為4 == 3,遞歸處理左半部分quickselect(nums, 3, 3, 4)

  7. 直接返回nums[4] = 5

最終結果是5,即第2大的元素。

時間復雜度

  • 平均情況:O(n)

  • 最壞情況(每次選擇的基準值都是最大或最小值):O(n2)

347. 前 K 個高頻元素

class Solution {public int[] topKFrequent(int[] nums, int k) {// 1. 使用哈希表統計每個數字出現的頻率Map<Integer, Integer> occurrences = new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault(num, 0) + 1);}// 2. 創建最小堆,按照出現頻率排序PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {public int compare(int[] m, int[] n) {return m[1] - n[1]; // 根據頻率比較}});// 3. 遍歷頻率哈希表,維護大小為k的最小堆for (Map.Entry<Integer, Integer> entry : occurrences.entrySet()) {int num = entry.getKey(), count = entry.getValue();if (queue.size() == k) {// 如果當前元素的頻率大于堆頂元素的頻率if (queue.peek()[1] < count) {queue.poll(); // 移除堆頂最小頻率元素queue.offer(new int[]{num, count}); // 加入當前元素}} else {queue.offer(new int[]{num, count});}}// 4. 從堆中提取結果int[] ret = new int[k];for (int i = 0; i < k; ++i) {ret[i] = queue.poll()[0]; // 取出數字部分}return ret;}
}

算法步驟

  1. 統計頻率

    • 使用哈希表occurrences記錄每個數字出現的次數

    • 遍歷數組,對每個數字的計數加1

  2. 構建最小堆

    • 創建優先隊列(最小堆),比較器基于頻率(數組的第二個元素)

    • 堆的大小限制為k,保持堆頂是當前k個元素中頻率最小的

  3. 維護堆

    • 遍歷頻率哈希表

    • 當堆未滿時,直接加入元素

    • 當堆已滿時,比較當前元素頻率與堆頂頻率

      • 如果當前頻率更高,替換堆頂元素

      • 否則跳過

  4. 提取結果

    • 從堆中依次取出元素,存入結果數組

    • 注意:由于是最小堆,取出的順序是從小到大,但不影響結果正確性

示例演示

假設輸入nums = [1,1,1,2,2,3]k = 2

  1. 統計頻率:

    • occurrences = {1:3, 2:2, 3:1}

  2. 構建堆過程:

    • 加入1:3 →?[(1,3)]

    • 加入2:2 →?[(2,2), (1,3)]

    • 處理3:1時堆已滿,3的頻率1小于堆頂2的頻率2,跳過

  3. 提取結果:

    • 彈出(2,2)和(1,3)

    • 結果[2,1](順序不重要)

時間復雜度分析

  • 統計頻率:O(n),n為數組長度

  • 建堆操作:O(m log k),m為不同數字的個數

    • 每個元素最多入堆一次,出堆一次

    • 堆操作時間復雜度為O(log k)

  • 總時間復雜度:O(n + m log k)

空間復雜度

  • 哈希表:O(m)

  • 堆:O(k)

  • 總空間復雜度:O(m + k)

優化建議

  1. 當k接近m時

    • 可以直接排序頻率哈希表,取前k個

    • 時間復雜度O(m log m)

  2. 使用快速選擇

    • 類似快速排序的分區思想

    • 平均時間復雜度O(n),但實現更復雜

  3. 并行處理

    • 對于大規模數據,可以并行統計頻率

為什么使用最小堆?

最小堆能高效維護前k大的元素:

  1. 堆的大小限制為k,空間效率高

  2. 每次只需要比較堆頂元素,決定是否替換

  3. 插入和刪除操作時間復雜度為O(log k)

這個實現很好地平衡了時間效率和代碼簡潔性,是解決Top K頻率問題的經典方法。

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

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

相關文章

CCS雙軸相位偏移光源 讓淺凹痕無處遁形

在工業檢測中&#xff0c;淺凹痕表面檢測對精度和可靠性要求極高&#xff0c;工業光源在此過程中扮演著關鍵角色&#xff0c;工業光源通過精準的光學設計&#xff08;角度、波長、強度&#xff09;將肉眼不可見的淺凹痕轉化為可量化的光學信號&#xff0c;是實現高精度自動化檢…

專題三_二分_x 的平方根

一&#xff1a;題目解釋&#xff1a;返回x的算數平方根&#xff0c;如果是小數&#xff0c;則舍去小數部分&#xff0c;返回整數即可&#xff01;二&#xff1a;算法①&#xff1a;暴力從1開始求平方&#xff0c;最后要么直接找到一個值的平方為x&#xff0c;要么發現x在兩個相…

Python 操作 Redis 的客戶端庫 redis-py

Python 操作 Redis 的客戶端庫 redis-py1. Installation2. Connect and test3. Connection Pools4. Redis Commands4.1. set(name, value, exNone, pxNone, nxFalse, xxFalse, keepttlFalse, getFalse, exatNone, pxatNone)4.1.1. setnx(name, value)4.1.2. setex(name, time, …

社區物業HCommunity本地部署手冊

HC小區管理系統安裝手動版 更多文章參考&#xff1a; http://www.homecommunity.cn/pages/hc/hcH5_cn.html 1.0 說明 很多開發不太喜歡用梓豪安裝&#xff0c;希望通過手工自己安裝&#xff0c;這個就需要開發人員 有一定的安裝軟件能力&#xff0c;比如能夠自行安裝mysql能…

單例模式-使用局部變量懶漢不用加鎖

在 C11 及之后&#xff0c;“局部靜態變量懶漢”&#xff08;Meyers’ Singleton&#xff09;不需要自己加鎖&#xff0c;標準已經幫你做好了線程安全。 Singleton& getInstance() {static Singleton inst; // ← 這一句并發時只會初始化一次return inst; }首次調用時&am…

51單片機-GPIO介紹

本章概述思維導圖&#xff1a;51單片機引腳介紹STC89系列51單片機引腳介紹STC89系列51單片機的引腳是單片機與外部電路連接的接口&#xff0c;用于實現電源供電、時鐘信號輸入、控制信號輸出以及數據輸入輸出等功能。PDIP封裝引腳圖&#xff1a;1. 電源引腳&#xff1a;VCC&…

CERT/CC警告:新型HTTP/2漏洞“MadeYouReset“恐致全球服務器遭DDoS攻擊癱瘓

2025年8月15日CERT/CC&#xff08;計算機應急響應協調中心&#xff09;近日發布漏洞公告&#xff0c;警告多個HTTP/2實現中新發現的缺陷可能被威脅行為者用于發起高效拒絕服務&#xff08;DoS&#xff09;或分布式拒絕服務&#xff08;DDoS&#xff09;攻擊。該漏洞被非正式命名…

[Chat-LangChain] 會話圖(LangGraph) | 大語言模型(LLM)

第二章&#xff1a;會話圖&#xff08;LangGraph&#xff09; 在第一章中&#xff0c;我們學習了前端用戶界面——這是聊天機器人的"面孔"&#xff0c;我們在這里輸入問題并查看答案。 我們看到了消息如何從聊天窗口傳遞到聊天機器人的"大腦"。現在&…

Flask錯誤處理與會話技術詳解

flask入門day03 錯誤處理 1.abort函數&#xff1a;放棄請求并返回錯誤代碼 詳細狀態碼 from flask import Flask,abort,render_template ? app Flask(__name__) ? app.route(/) def index():return 我是首頁 ? app.route(/error) def error():abort(404)return 沒有找到…

java程序打包成exe,再打成安裝包,沒有jdk環境下可運行

一、前提條件準備&#xff1a;1、要被打包的程序文件&#xff1a;rest_assistant-1.0-SNAPSHOT.jarapplication.yml2、圖標文件tubiao123.ico3、jre4、打包成exe的軟件 config.exe4j5、打成安裝包的軟件 Inno Setup Compiler二、config.exe4j 的 exe打包配置步驟 按照以下圖進行…

區塊鏈技術原理(11)-以太坊交易

文章目錄什么是交易&#xff1f;交易類型交易生命周期關鍵概念&#xff1a;Gas 與交易費用交易狀態與失敗原因總結什么是交易&#xff1f; “交易&#xff08;Transaction&#xff09;” 是從一個賬戶向另一個賬戶發送的經過數字簽名的指令 。例如&#xff0c;如果 Bob 發送 A…

小兔鮮兒-小程序uni-app(二)

小兔鮮兒-小程序uni-app7.小兔鮮兒 - 用戶模塊會員中心頁(我的)靜態結構參考代碼會員設置頁分包預下載靜態結構退出登錄會員信息頁靜態結構獲取會員信息渲染會員信息更新會員頭像更新表單信息8.小兔鮮兒 - 地址模塊準備工作靜態結構地址管理頁地址表單頁動態設置標題新建地址頁…

BLE 廣播信道與數據信道:沖突避免、信道映射與自適應跳頻實現

低功耗藍牙(BLE)技術憑借低功耗、短距離、低成本的特性,已廣泛應用于智能家居、可穿戴設備、工業物聯網等領域。在 BLE 協議中,信道管理是保障通信可靠性的核心機制,其中廣播信道與數據信道的設計、沖突避免策略、跳頻技術更是面試中的高頻考點。本文將從基礎原理到實戰真…

nodejs03-常用模塊

nodejs 常用的核心模塊 Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境&#xff0c; 它允許 JavaScript 運行在服務器端。Node.js 擁有豐富的標準庫&#xff0c;也就是核心模塊&#xff0c; 這些模塊提供了各種功能&#xff0c; 使得開發服務器端應用程序變得簡單高…

多路混音聲音播放芯片型號推薦

以下是唯創知音旗下主流的多路聲音播放芯片深度解析&#xff0c;結合精準參數、豐富場景及技術特性&#xff0c;滿足智能設備多樣化音頻需求&#xff1a;一、WTV380/890 系列&#xff1a;高集成多模態交互芯片核心參數通道能力&#xff1a;支持8 路獨立語音輸出&#xff0c;可同…

【C++】自研基 2 Cooley–Tukey

“自研基 2 Cooley–Tukey&#xff1a;倒位序 逐級蝶形&#xff0c;入口 fft(int N, complex f[])”拆成三件事它在講什么 “基 2 Cooley–Tukey” 指的是最常見的 FFT 算法&#xff1a;長度 N 必須是 2 的整數次冪&#xff0c;把離散傅里葉變換分解成一層一層的“2 點蝶形”運…

小白挑戰一周上架元服務——ArkUI04

文章目錄前言一、ArkUI是何方神圣&#xff1f;二、聲明式UI三、組件1.基礎組件2.布局容器組件3.導航組件4.自定義組件5.組件生命周期四、狀態管理1.State裝飾器: 狀態變量2.Prop裝飾器&#xff1a;父子單向同步3.Link裝飾器&#xff1a;父子雙向同步4.Provide/Consume裝飾器&am…

劇本殺小程序系統開發:構建劇本殺社交新生態

在社交需求日益多樣化的今天&#xff0c;劇本殺憑借其獨特的社交屬性&#xff0c;成為了人們熱衷的社交娛樂方式之一。而劇本殺小程序系統開發&#xff0c;則進一步拓展了劇本殺的社交邊界&#xff0c;構建起一個全新的劇本殺社交新生態&#xff0c;讓玩家在推理與角色扮演中&a…

AI提高投放效率的核心策略

內容概要人工智能技術正深刻改變著廣告投放領域&#xff0c;其核心價值在于顯著提升投放效率。通過融合智能算法優化、實時數據分析與自動化投放流程&#xff0c;AI系統能夠以前所未有的速度和精度處理海量信息&#xff0c;驅動更精準的營銷決策。這不僅大幅縮短了傳統人工操作…

OpenBMC 中命令模式的深度解析:從原理到實現

引言 在 OpenBMC 的設計中&#xff0c;命令模式&#xff08;Command Pattern&#xff09;被廣泛應用于各種場景&#xff0c;特別是 IPMI 命令處理、異步操作封裝和用戶請求管理等。本文將深入分析 OpenBMC 中命令模式的實現原理、架構設計以及完整的執行流程&#xff0c;并通過…