LeetCode 第 215 題:在未排序的數(shù)組中找到第 k 個(gè)最大的元素

傳送門:215. 數(shù)組中的第K個(gè)最大元素浑吟。

在未排序的數(shù)組中找到第 k 個(gè)最大的元素履肃。請(qǐng)注意偏灿,你需要找的是數(shù)組排序后的第 k 個(gè)最大的元素星瘾,而不是第 k 個(gè)不同的元素走孽。

示例 1:

輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5

示例 2:

輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4

說明:

你可以假設(shè) k 總是有效的,且 1 ≤ k ≤ 數(shù)組的長(zhǎng)度琳状。

這道題應(yīng)該說是無比重要的高頻考題磕瓷,是一定要掌握的,兩種思路分別使用了很基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)(優(yōu)先隊(duì)列)和算法(partition)念逞。

解法1:使用快速排序 partition 的思路

Python 代碼:

class Solution:

    # 數(shù)組中的第 K 個(gè)最大元素
    # 數(shù)組中第 k 大的元素困食,它的索引是 len(nums) - k
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """

        left = 0
        right = len(nums) - 1

        while True:
            index = self.__partition(nums, left, right)
            if index == len(nums) - k:
                return nums[index]
            if index > len(nums) - k:
                right = index - 1
            else:
                left = index + 1

    def __partition(self, nums, left, right):
        """
        partition 是必須要會(huì)的子步驟,一定要非常熟練
        典型的例子就是:[3,7,8,1,2,4]
        遇到比第一個(gè)元素大的或等于的翎承,就放過硕盹,遇到小的,就交換
        在 [left,right] 這個(gè)區(qū)間執(zhí)行 partition
        :param nums:
        :param left:
        :param right:
        :return:
        """
        pivot = nums[left]
        k = left
        for index in range(left + 1, right + 1):
            if nums[index] < pivot:
                k += 1
                nums[k], nums[index] = nums[index], nums[k]
        nums[left], nums[k] = nums[k], nums[left]
        return k


if __name__ == '__main__':
    nums = [3, 7, 8, 1, 2, 4]
    solution = Solution()
    result = solution.findKthLargest(nums, 2)
    print(result)

解法2:使用優(yōu)先隊(duì)列

參考了:https://leetcode.com/problems/kth-largest-element-in-an-array/discuss/167837/Python-or-tm

Python 代碼:

import heapq

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        L = []
        for index in range(k):
            # 默認(rèn)是最小堆
            heapq.heappush(L, nums[index])
        for index in range(k, len(nums)):
            top = L[0]
            if nums[index] > top:
                # 看一看堆頂?shù)脑剡犊В灰榷秧斣卮蟠窭吞鎿Q堆頂元素
                heapq.heapreplace(L, nums[index])
        # 最后堆頂中的元素就是堆中最小的,整個(gè)數(shù)組中的第 k 大元素
        return L[0]


if __name__ == '__main__':
    nums = [3, 7, 8, 1, 2, 4]
    solution = Solution()
    result = solution.findKthLargest(nums, 2)
    print(result)

(本節(jié)完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甸各,一起剝皮案震驚了整個(gè)濱河市垛贤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痴晦,老刑警劉巖南吮,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誊酌,居然都是意外死亡部凑,警方通過查閱死者的電腦和手機(jī)露乏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涂邀,“玉大人瘟仿,你說我怎么就攤上這事”让悖” “怎么了劳较?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)浩聋。 經(jīng)常有香客問我观蜗,道長(zhǎng),這世上最難降的妖魔是什么衣洁? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任墓捻,我火速辦了婚禮,結(jié)果婚禮上坊夫,老公的妹妹穿的比我還像新娘砖第。我一直安慰自己,他們只是感情好环凿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布梧兼。 她就那樣靜靜地躺著,像睡著了一般智听。 火紅的嫁衣襯著肌膚如雪羽杰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天瞭稼,我揣著相機(jī)與錄音忽洛,去河邊找鬼。 笑死环肘,一個(gè)胖子當(dāng)著我的面吹牛欲虚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悔雹,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼复哆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了腌零?” 一聲冷哼從身側(cè)響起梯找,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎益涧,沒想到半個(gè)月后锈锤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年久免,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浅辙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阎姥,死狀恐怖记舆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呼巴,我是刑警寧澤泽腮,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站衣赶,受9級(jí)特大地震影響诊赊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屑埋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一豪筝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摘能,春花似錦、人聲如沸敲街。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)多艇。三九已至逻恐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間峻黍,已是汗流浹背复隆。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姆涩,地道東北人挽拂。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骨饿,于是被迫代替她去往敵國(guó)和親亏栈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351