可視化圖解算法50:最小的K個數

牛客網 面試筆試? ?TOP101 ? ?| ? ? LeetCode 面試題 17.14. ?最小K個數

1. 題目

描述

給定一個長度為 n 的可能有重復值的數組,找出其中不去重的最小的 k 個數。例如數組元素是4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4(任意順序皆可)。

數據范圍:0≤k,n≤10000,數組中每個數的大小0≤val≤1000

要求:空間復雜度 O(n),時間復雜度 O(nlogn)

示例1

輸入:

[4,5,1,6,2,7,3,8],4

返回值:

[1,2,3,4]

說明:

返回最小的4個數即可,返回[1,3,2,4]也可以 ? ? ? ?

示例2

輸入:

[1],0

返回值:

[ ]

示例3

輸入:

[0,1,2,1,2],3

返回值:

[0,1,1]

2. 解題思路

最小的K個數的求解問題是典型的Top K問題,一般通過堆來完成。先來看看什么是堆:

堆" 是一個在計算機科學中經常使用的術語,它通常指的是一種特殊的樹形數據結構——二叉堆(binary heap)。二叉堆通常滿足堆屬性(heap property),即父節點的值總是大于或等于(或小于或等于,取決于堆的類型)其子節點的值。

堆是一種完全二叉樹結構,并滿足以下性質之一:

  • 最大堆(Max-Heap):每個父節點的值大于或等于其子節點的值。

  • 最小堆(Min-Heap):每個父節點的值小于或等于其子節點的值。

核心特性

  1. 完全二叉樹:

    除了最后一層,其他層節點全部填滿,且最后一層節點盡可能靠左排列。

  2. 高效操作:

    插入和刪除操作的時間復雜度為 O(log n),建堆時間復雜度為 O(n)

堆的存儲方式

  • 數組實現(最常用):

    • 父節點索引為 i,則左子節點為 2i+1,右子節點為 2i+2

    • 子節點索引為 i,則父節點為 (i-1)//2

  • 示例

    (數組表示的堆):

    <span style="background-color:#f8f8f8 !important">數組:[9, 5, 3, 2, 4, 1]
    對應完全二叉樹:9/   \5     3/ \   /2  4 1

堆的應用場景

優先隊列:任務調度、Dijkstra 算法。

  • 堆排序:時間復雜度 O(n log n),原地排序但不穩定。

  • Top K 問題:快速找到數據流中最大/最小的 K 個元素。

  • 合并有序序列:如合并 K 個有序鏈表。

堆(Heap)是一種特殊的樹形數據結構,通常以完全二叉樹的形式實現,具有以下核心特性:


常見誤區

  1. 堆與內存堆:

    數據結構中的“堆”與程序內存管理中的“堆”(Heap Memory)完全不同。

  2. 堆的有序性:

    堆僅保證根節點是極值,子樹之間不一定有序。

如果文字描述的不太清楚,你可以參考視頻的詳細講解。

  • Python編碼:Python數據結構LeetCode筆試面試算法_嗶哩嗶哩_bilibiliPython數據結構LeetCode筆試面試算法,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ep1372869

  • Java編碼:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ep1367923

  • Golang編碼:LeetCode數據結構筆試面試算法-Go語言版_嗶哩嗶哩_bilibiliLeetCode數據結構筆試面試算法-Go語言版,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ep1364949

3. 編碼實現

核心代碼如下:

/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可*** @param input int整型一維數組* @param k int整型* @return int整型一維數組*/
func GetLeastNumbers_Solution(input []int, k int) []int {// write code hereres := make([]int, 0)if k == 0 || len(input) < k {return res}//1.定義一個大頂堆(最大元素在最上面)h := make(MyHeap, 0, k)heap.Init(&h)//2.先將k個元素加入堆for i := 0; i < k; i++ {heap.Push(&h, input[i])}//3.如果當前元素小于堆頂的元素(待加入的元素比堆中的小)則將堆中的最大元素彈出,新元素入堆//彈出的作用:保證堆中只存儲最小的k個數據for i := k; i < len(input); i++ {if input[i] < h[0] {heap.Pop(&h)heap.Push(&h, input[i])}}//4.堆中的元素彈出,存儲到數組中返回for h.Len() > 0 {res = append(res, heap.Pop(&h).(int))}return res
}

具體完整代碼你可以參考下面視頻的詳細講解。

  • Python編碼:Python數據結構LeetCode筆試面試算法_嗶哩嗶哩_bilibiliPython數據結構LeetCode筆試面試算法,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ep1372869

  • Java編碼:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ep1367923

  • Golang編碼:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364949

4.小結

最小的K個數可以通過大頂堆完成,具體操作步驟為:

  1. 定義一個大頂堆,堆的大小為 K;

  2. 堆中存儲最小的K個數;

  3. 先從數組中取出 K 個元素加入堆;

  4. 再從數組中取出其他元素,如果該元素小于堆頂的元素,從堆中彈出元素,將該元素加入堆;

  5. 數組中的元素取完,堆中的數據就是最小的K個數。

《數據結構與算法》深度精講課程正式上線啦!7 大核心算法模塊全解析:

? ? ? 鏈表

? ? ? 二叉樹

? ? ? 二分查找、排序

? ? ? 堆、棧、隊列

? ? ? 回溯算法

? ? ? 哈希算法

? ? ? 動態規劃

無論你是備戰筆試面試、提升代碼效率,還是突破技術瓶頸,這套課程都將為你構建扎實的算法思維底座。🔥立即加入學習打卡,與千名開發者共同進階!

  • Python編碼實現:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ss897667807

  • Java編碼實現:LeetCode數據結構筆試面試算法-Java版_嗶哩嗶哩_bilibiliLeetCode數據結構筆試面試算法-Java版,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ss161443488

  • Golang編碼實現:LeetCode數據結構筆試面試算法-Go語言版_嗶哩嗶哩_bilibiliLeetCode數據結構筆試面試算法-Go語言版,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ss63997

對于數據結構與算法,我們總結了一套【可視化+圖解】方法,依據此方法來解決相關問題,算法變得易于理解,寫出來的代碼可讀性高也不容易出錯。具體也可以參考視頻詳細講解。

今日佳句:千磨萬擊還堅勁,任爾東西南北風。

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

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

相關文章

Ragflow配置注意項

在 .env文件中啟用v.0.19.0版本&#xff0c;帶emabedding models RAGFLOW_IMAGEinfiniflow/ragflow:v0.19.0 RAGFlow image tagImage size (GB)Has embedding models?Stable?v0.19.0≈9??Stable releasev0.19.0-slim≈2?Stable releasenightly≈9??Unstable nightly b…

Word VBA快速制作填空題

實例需求&#xff1a;Word文檔用于英語單詞學習&#xff0c;重點記憶單詞標記下劃線&#xff0c;其內容如下圖所示。 現在文檔轉換為填空題&#xff08;無論單詞字符多少&#xff0c;填空部分統一使用10個空格&#xff09;和參考答案兩部分&#xff0c;如下圖所示。 示例代碼如…

不變性(Immutability)模式

1. 不變性&#xff08;Immutability&#xff09;模式 1.1. 不變性模式的概念 定義&#xff1a;對象一旦被創建&#xff0c;其內部狀態就不再發生變化&#xff0c;也即“只讀無寫”&#xff0c;不會出現并發寫的問題&#xff0c;自然線程安全。 適用場景&#xff1a;只讀共享…

探秘鴻蒙 HarmonyOS NEXT:鴻蒙定時器,簡單倒計時的場景應用

在鴻蒙 ArkTS 開發中&#xff0c;定時器是實現動態效果和定時任務的重要工具。基于鴻蒙 API 12 及以上版本&#xff0c;ArkTS 提供了功能豐富的定時器 API&#xff0c;本文將帶你全面了解定時器的使用方法。 一、定時器常用 API 介紹 ArkTS 中的定時器主要分為一次性定時器&a…

安卓基礎(語義樹)

進化1 package com.example.demotest.unread;import android.accessibilityservice.AccessibilityService; import android.content.res.Resources; import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.Log; import android.view.access…

Linux基礎開發工具——vim工具

文章目錄 vim工具什么是vimvim的多模式和使用vim的基礎模式vim的三種基礎模式三種模式的初步了解 常用模式的詳細講解插入模式命令模式模式轉化光標的移動文本的編輯 底行模式替換模式視圖模式總結 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是繼續講解Linux系統下的…

C++_核心編程_多態案例二-制作飲品

#include <iostream> #include <string> using namespace std;/*制作飲品的大致流程為&#xff1a;煮水 - 沖泡 - 倒入杯中 - 加入輔料 利用多態技術實現本案例&#xff0c;提供抽象制作飲品基類&#xff0c;提供子類制作咖啡和茶葉*//*基類*/ class AbstractDr…

AcWing--數據結構1

用數組來模擬鏈表。這種實現鏈表的方式也叫靜態鏈表。 1.單鏈表 寫鄰接表&#xff1a;存儲圖和樹 我們定義&#xff1a;e[N]用來表示某個點的值是多少&#xff1b;ne[N]用來表示某個點的next指針是多少 e和ne是用下標關聯起來的 如&#xff1a;head->3->5->7->…

云啟出海,智聯未來|阿里云網絡「企業出海」系列客戶沙龍上海站圓滿落地

借阿里云中企出海大會的東風&#xff0c;以**「云啟出海&#xff0c;智聯未來&#xff5c;打造安全可靠的出海云網絡引擎」為主題的阿里云企業出海客戶沙龍云網絡&安全專場于5.28日下午在上海順利舉辦&#xff0c;現場吸引了來自攜程、小紅書、米哈游、嗶哩嗶哩、波克城市、…

多模態分類案例實現

以下是基于飛槳平臺實現的多模態分類詳細案例&#xff0c;結合圖像和文本信息進行分類任務。案例包含數據處理、模型構建、訓練和評估的完整流程&#xff0c;并提供詳細注釋&#xff1a; 一、多模態分類案例實現 import os import json import numpy as np from PIL import I…

Express框架:Node.js的輕量級Web應用利器

Hi,我是布蘭妮甜 !在當今快速發展的Web開發領域,Node.js已成為構建高性能、可擴展網絡應用的重要基石。而在這片肥沃的生態系統中,Express框架猶如一座經久不衰的燈塔,指引著無數開發者高效構建Web應用的方向。本文章在為讀者提供一份全面而深入的Express框架指南。無論您…

K-Means顏色變卦和漸變色

一、理論深度提升&#xff1a;補充算法細節與數學基礎 1. K-Means 算法核心公式&#xff08;增強專業性&#xff09; 在 “原理步驟” 中加入數學表達式&#xff0c;說明聚類目標&#xff1a; K-Means 的目標是最小化簇內平方和&#xff08;Within-Cluster Sum of Squares, W…

深入解析C#表達式求值:優先級、結合性與括號的魔法

—— 為什么2/6*4不等于1/12&#xff1f; &#x1f50d; 一、表達式求值順序為何重要&#xff1f; 表達式如精密儀器&#xff0c;子表達式求值順序直接決定結果。例如&#xff1a; int result 3 * 5 2;若先算乘法&#xff1a;(3*5)2 17 ?若先算加法&#xff1a;3*(52)21…

Docker 離線安裝指南

參考文章 1、確認操作系統類型及內核版本 Docker依賴于Linux內核的一些特性&#xff0c;不同版本的Docker對內核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux內核3.10及以上版本&#xff0c;Docker17.09及更高版本對應Linux內核4.9.x及更高版本。…

Spring——Spring相關類原理與實戰

摘要 本文深入探討了 Spring 框架中 InitializingBean 接口的原理與實戰應用&#xff0c;該接口是 Spring 提供的一個生命周期接口&#xff0c;用于在 Bean 屬性注入完成后執行初始化邏輯。文章詳細介紹了接口定義、作用、典型使用場景&#xff0c;并與其他相關概念如 PostCon…

Angular微前端架構:Module Federation + ngx-build-plus (Webpack)

以下是一個完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 實現了主應用&#xff08;Shell&#xff09;與子應用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;? 項目結構 angular-mf/ ├── shell-app/ # 主應用&…

ESP32 I2S音頻總線學習筆記(四): INMP441采集音頻并實時播放

簡介 前面兩期文章我們介紹了I2S的讀取和寫入&#xff0c;一個是通過INMP441麥克風模塊采集音頻&#xff0c;一個是通過PCM5102A模塊播放音頻&#xff0c;那如果我們將兩者結合起來&#xff0c;將麥克風采集到的音頻通過PCM5102A播放&#xff0c;是不是就可以做一個擴音器了呢…

馮諾依曼架構是什么?

馮諾依曼架構是什么&#xff1f; 馮諾依曼架構&#xff08;Von Neumann Architecture&#xff09;是現代計算機的基礎設計框架&#xff0c;由數學家約翰馮諾依曼&#xff08;John von Neumann&#xff09;及其團隊在1945年提出。其核心思想是通過統一存儲程序與數據&#xff0…

【持續更新】linux網絡編程試題

問題1 請簡要說明TCP/IP協議棧的四層結構&#xff0c;并分別舉出每一層出現的典型協議或應用。 答案 應用層&#xff1a;ping,telnet,dns 傳輸層&#xff1a;tcp,udp 網絡層&#xff1a;ip,icmp 數據鏈路層&#xff1a;arp,rarp 問題2 下列協議或應用分別屬于TCP/IP協議…

橢圓曲線密碼學(ECC)

一、ECC算法概述 橢圓曲線密碼學&#xff08;Elliptic Curve Cryptography&#xff09;是基于橢圓曲線數學理論的公鑰密碼系統&#xff0c;由Neal Koblitz和Victor Miller在1985年獨立提出。相比RSA&#xff0c;ECC在相同安全強度下密鑰更短&#xff08;256位ECC ≈ 3072位RSA…