日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

215.數(shù)組中的第K個最大元素(Medium)

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:labuladong ? 作者:labuladong ? 2020-12-02 16:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

讀完本文,可以去力扣解決如下題目:

215.數(shù)組中的第 K 個最大元素(Medium)

快速選擇算法是一個非常經(jīng)典的算法,和快速排序算法是親兄弟。

原始題目很簡單,給你輸入一個無序的數(shù)組nums和一個正整數(shù)k,讓你計算nums中第k大的元素。

那你肯定說,給nums數(shù)組排個序,然后取第k個元素,也就是nums[k-1],不就行了嗎?

當(dāng)然可以,但是排序時間復(fù)雜度是O(NlogN),其中N表示數(shù)組nums的長度。

我們就想要第k大的元素,卻給整個數(shù)組排序,有點殺雞用牛刀的感覺,所以這里就有一些小技巧了,可以把時間復(fù)雜度降低到O(NlogK)甚至是O(N),下面我們就來具體講講。

力扣第 215 題「數(shù)組中的第 K 個最大元素」就是一道類似的題目,函數(shù)簽名如下:

intfindKthLargest(int[]nums,intk);

只不過題目要求找第k個最大的元素,和我們剛才說的第k大的元素在語義上不太一樣,題目的意思相當(dāng)于是把nums數(shù)組降序排列,然后返回第k個元素。

比如輸入nums = [2,1,5,4], k = 2,算法應(yīng)該返回 4,因為 4 是nums中第 2 個最大的元素。

這種問題有兩種解法,一種是二叉堆(優(yōu)先隊列)的解法,另一種就是標(biāo)題說到的快速選擇算法(Quick Select),我們分別來看。

二叉堆解法

二叉堆的解法比較簡單,實際寫算法題的時候,推薦大家寫這種解法,先直接看代碼吧:

二叉堆(優(yōu)先隊列)是比較常見的數(shù)據(jù)結(jié)構(gòu),可以認(rèn)為它會自動排序,我們前文 手把手實現(xiàn)二叉堆數(shù)據(jù)結(jié)構(gòu) 實現(xiàn)過這種結(jié)構(gòu),我就默認(rèn)大家熟悉它的特性了。

看代碼應(yīng)該不難理解,可以把小頂堆pq理解成一個篩子,較大的元素會沉淀下去,較小的元素會浮上來;當(dāng)堆大小超過k的時候,我們就刪掉堆頂?shù)脑?,因為這些元素比較小,而我們想要的是前k個最大元素嘛。當(dāng)nums中的所有元素都過了一遍之后,篩子里面留下的就是最大的k個元素,而堆頂元素是堆中最小的元素,也就是「第k個最大的元素」。

二叉堆插入和刪除的時間復(fù)雜度和堆中的元素個數(shù)有關(guān),在這里我們堆的大小不會超過k,所以插入和刪除元素的復(fù)雜度是O(logK),再套一層 for 循環(huán),總的時間復(fù)雜度就是O(NlogK)。空間復(fù)雜度很顯然就是二叉堆的大小,為O(K)。

這個解法算是比較簡單的吧,代碼少也不容易出錯,所以說如果筆試面試中出現(xiàn)類似的問題,建議用這種解法。唯一注意的是,Java 的PriorityQueue默認(rèn)實現(xiàn)是小頂堆,有的語言的優(yōu)先隊列可能默認(rèn)是大頂堆,可能需要做一些調(diào)整。

快速選擇算法

快速選擇算法比較巧妙,時間復(fù)雜度更低,是快速排序的簡化版,一定要熟悉思路。

我們先從快速排序講起。

快速排序的邏輯是,若要對nums[lo..hi]進行排序,我們先找一個分界點p,通過交換元素使得nums[lo..p-1]都小于等于nums[p],且nums[p+1..hi]都大于nums[p],然后遞歸地去nums[lo..p-1]和nums[p+1..hi]中尋找新的分界點,最后整個數(shù)組就被排序了。

快速排序的代碼如下:

關(guān)鍵就在于這個分界點索引p的確定,我們畫個圖看下partition函數(shù)有什么功效:

索引p左側(cè)的元素都比nums[p]小,右側(cè)的元素都比nums[p]大,意味著這個元素已經(jīng)放到了正確的位置上,回顧快速排序的邏輯,遞歸調(diào)用會把nums[p]之外的元素也都放到正確的位置上,從而實現(xiàn)整個數(shù)組排序,這就是快速排序的核心邏輯。

那么這個partition函數(shù)如何實現(xiàn)的呢?看下代碼:

熟悉快速排序邏輯的讀者應(yīng)該可以理解這段代碼的含義了,這個partition函數(shù)細節(jié)較多,上述代碼參考《算法4》,是眾多寫法中最漂亮簡潔的一種,所以建議背住,這里就不展開解釋了。

好了,對于快速排序的探討到此結(jié)束,我們回到一開始的問題,尋找第k大的元素,和快速排序有什么關(guān)系?

注意這段代碼:

intp=partition(nums,lo,hi);

我們剛說了,partition函數(shù)會將nums[p]排到正確的位置,使得nums[lo..p-1] < nums[p] < nums[p+1..hi]。

那么我們可以把p和k進行比較,如果p < k說明第k大的元素在nums[p+1..hi]中,如果p > k說明第k大的元素在nums[lo..p-1]中。

所以我們可以復(fù)用partition函數(shù)來實現(xiàn)這道題目,不過在這之前還是要做一下索引轉(zhuǎn)化:

題目要求的是「第k個最大元素」,這個元素其實就是nums升序排序后「索引」為len(nums) - k的這個元素。

這樣就可以寫出解法代碼:

這個代碼框架其實非常像我們前文二分搜索框架的代碼,這也是這個算法高效的原因,但是時間復(fù)雜度為什么是O(N)呢?按理說類似二分搜索的邏輯,時間復(fù)雜度應(yīng)該一定會出現(xiàn)對數(shù)才對呀?

其實這個O(N)的時間復(fù)雜度是個均攤復(fù)雜度,因為我們的partition函數(shù)中需要利用雙指針技巧遍歷nums[lo..hi],那么總共遍歷了多少元素呢?

最好情況下,每次p都恰好是正中間(lo + hi) / 2,那么遍歷的元素總數(shù)就是:

N + N/2 + N/4 + N/8 + … + 1

這就是等比數(shù)列求和公式嘛,求個極限就等于2N,所以遍歷元素個數(shù)為2N,時間復(fù)雜度為O(N)。

但我們其實不能保證每次p都是正中間的索引的,最壞情況下p一直都是lo + 1或者一直都是hi - 1,遍歷的元素總數(shù)就是:

N + (N - 1) + (N - 2) + … + 1

這就是個等差數(shù)列求和,時間復(fù)雜度會退化到O(N^2),為了盡可能防止極端情況發(fā)生,我們需要在算法開始的時候?qū)ums數(shù)組來一次隨機打亂:

前文洗牌算法詳解寫過隨機亂置算法,這里就不展開了。當(dāng)你加上這段代碼之后,平均時間復(fù)雜度就是O(N)了,提交代碼后運行速度大幅提升。

總結(jié)一下,快速選擇算法就是快速排序的簡化版,復(fù)用了partition函數(shù),快速定位第 k 大的元素。相當(dāng)于對數(shù)組部分排序而不需要完全排序,從而提高算法效率,將平均時間復(fù)雜度降到O(N)。

責(zé)任編輯:xj

原文標(biāo)題:快排親兄弟:快速選擇算法詳解

文章出處:【微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4810

    瀏覽量

    98610
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74419

原文標(biāo)題:快排親兄弟:快速選擇算法詳解

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    深入解析TPS54372EVM - 215評估模塊

    評估模塊,了解其性能、特點以及使用過程的注意事項。 文件下載: TPS54372EVM-215.pdf 1. 模塊概述 TPS54372EVM - 215評估模塊采用了TPS54372跟蹤/終止同步
    的頭像 發(fā)表于 04-24 14:55 ?158次閱讀

    單片機常用的14C語言算法分享

    ) 基本思想:(將相鄰兩個數(shù)比較,小的調(diào)到前頭) 1)有n個數(shù)(存放在數(shù)組a(n)),第一趟將每相鄰兩個數(shù)比較,小的調(diào)到前頭,經(jīng)n-1次兩兩相鄰比較后,最大的數(shù)已“沉底”,放在最后一
    發(fā)表于 01-29 06:59

    C語言插入排序算法和代碼

    和待插入的元素。第一輪時,將第一元素作為排序好的子數(shù)組,插入第二元素;第二輪,將前兩
    發(fā)表于 01-15 06:44

    HD3SS215:高速差分開關(guān)的卓越之選

    HD3SS215:高速差分開關(guān)的卓越之選 在當(dāng)今高速數(shù)據(jù)傳輸?shù)臅r代,一款性能出色的差分開關(guān)對于確保信號完整性和系統(tǒng)穩(wěn)定性至關(guān)重要。今天,我們就來深入了解一下TI推出的HD3SS215高速差分開
    的頭像 發(fā)表于 01-14 09:40 ?632次閱讀

    HD3SS215:高速差分開關(guān)的卓越之選

    和靈活的配置,成為了眾多應(yīng)用場景的理想選擇。本文將深入介紹HD3SS215的特點、應(yīng)用、詳細規(guī)格以及設(shè)計要點,為電子工程師們在實際設(shè)計中提供有價值的參考。 文件下載: hd3ss215.pdf 一、HD3SS
    的頭像 發(fā)表于 12-22 14:30 ?1090次閱讀

    TUSB215-Q1 USB 2.0高速信號調(diào)節(jié)器:技術(shù)解析與應(yīng)用指南

    傳輸通道的ISI信號損失,助力通過USB電氣合規(guī)性測試。下面,我們就來詳細了解這款器件。 文件下載: tusb215-q1.pdf 一、TUSB215-Q1特性亮點 1. 汽車級可靠性
    的頭像 發(fā)表于 12-18 16:40 ?441次閱讀

    TUSB215:USB 2.0 高速信號調(diào)節(jié)器的卓越之選

    TUSB215:USB 2.0 高速信號調(diào)節(jié)器的卓越之選 在當(dāng)今數(shù)字化飛速發(fā)展的時代,USB 接口作為數(shù)據(jù)傳輸和設(shè)備連接的重要橋梁,被廣泛應(yīng)用于各種電子設(shè)備。然而,隨著傳輸距離的增加和信號的衰減
    的頭像 發(fā)表于 12-18 16:40 ?920次閱讀

    線性搜索與二分搜索介紹

    線性搜索(Linear Search):從數(shù)組的第一元素開始,依次將當(dāng)前元素與目標(biāo)值進行比較,直到找到目標(biāo)值或搜索完整個數(shù)組。 二分搜索(
    發(fā)表于 12-01 07:36

    數(shù)組的初體驗

    名稱[1] = 元素2; 數(shù)組名稱[n-1] = 元素n; 我們將數(shù)據(jù)放到數(shù)組之后又如何獲取數(shù)組
    發(fā)表于 11-25 08:06

    二維數(shù)組介紹

    定義是這樣的: int array[n][m] 訪問: array[a] 那么被訪問元素地址的計算方式就是: array + (m * a + b) 這個就是二維數(shù)組在內(nèi)存的本質(zhì),其實和一維
    發(fā)表于 11-25 07:42

    數(shù)組程序無法運行怎么解決?

    主控是103,程序定義一const類型 128k只讀數(shù)組,放在flash上,程序無法運行,堆棧都初始化不了,在keil編譯下正常,在rtthread studio下編譯無法運行,求
    發(fā)表于 09-15 06:21

    EDS分析元素的基本原理

    EDS對元素定性分析高能電子束入射到樣品表面部分區(qū)域,這部分區(qū)域表層的原子,其殼層(K、L層等)的電子被激發(fā)到較高能量的外殼層(L、M層等)或者原子外成為二次電子,該原子處于激發(fā)態(tài)(高能量),為使
    的頭像 發(fā)表于 08-08 11:41 ?1624次閱讀
    EDS分析<b class='flag-5'>元素</b>的基本原理

    請問K230和K230D有哪些區(qū)別?

    路 ADC K230D 芯片封裝是 11x11,K230 芯片封裝為 13x13 您可參考資料下載專區(qū)的K230芯片引腳定義的 5
    發(fā)表于 06-11 06:46

    現(xiàn)在有一三維數(shù)組rgb,怎么通過k230把他轉(zhuǎn)變成圖片顯示出來?

    現(xiàn)在有一三維數(shù)組rgb,怎么通過k230把他轉(zhuǎn)變成圖片顯示出來
    發(fā)表于 06-10 08:17

    M215HGE-L31規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《M215HGE-L31規(guī)格書.pdf》資料免費下載
    發(fā)表于 06-04 17:27 ?0次下載
    田林县| 河北区| 宁城县| 昭苏县| 英山县| 临沧市| 太仆寺旗| 绵竹市| 汉川市| 宁乡县| 遂溪县| 威信县| 古蔺县| 文安县| 永嘉县| 道真| 信宜市| 武安市| 镇安县| 江源县| 井冈山市| 堆龙德庆县| 社旗县| 建昌县| 大连市| 长治县| 阜新| 炎陵县| 大余县| 嫩江县| 吴忠市| 仙居县| 乐东| 遂川县| 新干县| 高要市| 枣阳市| 盐亭县| 石景山区| 榆中县| 抚松县|