求解數(shù)組第k大元素(快排思想)

題目鏈接:https://leetcode.com/problems/kth-largest-element-in-an-array/description/
解題之前锨苏,先回顧下快速排序的過程:

  1. 從數(shù)組中選定基準(zhǔn)數(shù)耿币,即pivot梳杏;
  2. 搬運(yùn)元素,將數(shù)組中小于pivot的元素放到pivot前面淹接,大于pivot的元素放于pivot后面十性;
  3. 對pivot前面和后面的兩個子序列遞歸上述操作,直至子序列的長度為1或?yàn)榭铡?/li>

快排原理不算深奧塑悼,但第二步元素搬運(yùn)容易亂或者說思路不明朗劲适,這里推薦一篇博客:白話經(jīng)典算法系列之六 快速排序 快速搞定,這個博主表達(dá)了一種挖坑填數(shù)的方法厢蒜,有利于理解和記憶霞势。具體代碼可以看博客。
回歸正題斑鸦,這道題是快排的延伸愕贡,面試容易遇到。理解了快排思想巷屿,也容易想到這道題的思路固以。快排時,每一次將序列分成子序列時憨琳,pivot的index或者比k大诫钓,或者比k小,不斷通過index去逼近k篙螟,得到答案菌湃。
Accept代碼如下:

class Solution {
    public int findKthLargest(int[] nums, int k) {
        // 數(shù)組的第k大即第n-k小,轉(zhuǎn)換一下
        return helper(nums, 0, nums.length-1, nums.length-k);
    }
    
    public int helper(int[] nums, int lo, int hi, int k)
    {
        int pivot = nums[lo];
        int i = lo, j = hi;
        // 這里采用的是那篇博主的挖坑填數(shù)法遍略,邏輯很清晰
        while(i < j)
        {
            while(i < j && nums[j] >= pivot)
            {
                j--;
            }
            if (i<j)
            {
                nums[i] = nums[j];
                i++;
            }
            while(i<j && nums[i] < pivot)
            {
                i++;
            }
            if(i<j)
            {
                nums[j] = nums[i];
                j--;
            }
        }
        nums[i] = pivot;
        // 利用i逼近k
        // k比i大的情形惧所,k在i后面的子序列
        if (i < k)
            return helper(nums, i+1, hi, k);
        // k比i小的情形,k在i前面的子序列
        if (i > k)
            return helper(nums, lo, i-1, k);
        return nums[i];
    }
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墅冷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子或油,更是在濱河造成了極大的恐慌寞忿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顶岸,死亡現(xiàn)場離奇詭異腔彰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辖佣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門霹抛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卷谈,你說我怎么就攤上這事杯拐。” “怎么了世蔗?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵端逼,是天一觀的道長。 經(jīng)常有香客問我污淋,道長顶滩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任寸爆,我火速辦了婚禮礁鲁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赁豆。我一直安慰自己仅醇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布魔种。 她就那樣靜靜地躺著着憨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪务嫡。 梳的紋絲不亂的頭發(fā)上甲抖,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天漆改,我揣著相機(jī)與錄音,去河邊找鬼准谚。 笑死挫剑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柱衔。 我是一名探鬼主播樊破,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唆铐!你這毒婦竟也來了哲戚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤艾岂,失蹤者是張志新(化名)和其女友劉穎顺少,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體王浴,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脆炎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氓辣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秒裕。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钞啸,靈堂內(nèi)的尸體忽然破棺而出几蜻,到底是詐尸還是另有隱情,我是刑警寧澤体斩,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布入蛆,位于F島的核電站,受9級特大地震影響硕勿,放射性物質(zhì)發(fā)生泄漏哨毁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一源武、第九天 我趴在偏房一處隱蔽的房頂上張望扼褪。 院中可真熱鬧,春花似錦粱栖、人聲如沸话浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幔崖。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赏寇,已是汗流浹背吉嫩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗅定,地道東北人自娩。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像渠退,于是被迫代替她去往敵國和親忙迁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概述:JDK提供了概述:JDK提供了對于數(shù)組排序的庫函數(shù)碎乃,java.util.Arrays類中的一些列重載的sor...
    張晨輝Allen閱讀 3,031評論 1 5
  • 排序算法說明 (1)排序的定義:對一序列對象根據(jù)某個關(guān)鍵字進(jìn)行排序姊扔; 輸入:n個數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 651評論 0 0
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序梅誓,而外部排序是因排序的數(shù)據(jù)很大恰梢,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評論 0 15
  • 1 工作流程 首先需要說明的是,git的版本庫是以分支的形式進(jìn)行管理的证九。當(dāng)我們初始化一個新的版本庫時删豺,會自動創(chuàng)建版...
    happy_19閱讀 2,728評論 0 1
  • 風(fēng)滑過指尖共虑,輕吻臉龐 記憶如同一場夢 時光開始倒帶 所有的因素構(gòu)成相似的場景 殘陽如火愧怜,微香輕浮 湖面印刻你的笑容...
    木粥粥閱讀 593評論 5 9