標籤:
題目描述:在數組中找到第k大的元素
範例:給出數組 [9,3,2,4,8],第三大的元素是 4;給出數組 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此類推
和上一道中位元的題(詳見:點擊開啟連結)是一模一樣的,需要注意的是,數組既然要按升序排列,那麼第k大元素就是數組的倒數第k位,也就是索引為n - k的元素,還是按照快排的思想,通過一個分割函數找到每次樞軸應該排在的位置,比較這個位置和n - k的前後,如果恰好是n - k,直接返回;如果小於n - k,則說明需要在樞軸所在後面的數組中找尋;如果大於n - k,則說明需要在樞軸所在前面的數組中找尋。這個思路如果還有疑問,請移步我剛才給的連結。
那麼代碼幾乎跟“中位元”的題是一樣的,如下:
class Solution: # @param k & A a integer and an array # @return ans a integer def kthLargestElement(self, k, A): n = len(A) if n == 0: return None begin, end = 0, n - 1 index = self.partition(A, 0, n - 1) while index != n - k: if index > n - k: end = index - 1 index = self.partition(A, begin, end) else: begin = index + 1 index = self.partition(A, begin, end) return A[index] def partition(self, A, begin, end): if begin >= end: return begin pivot = A[begin] index = begin for i in range(begin + 1, end + 1): if A[i] <= pivot: index += 1 A[i], A[index] = A[index], A[i] A[begin], A[index] = A[index], A[begin] return index
這兩道題,包括前面排列顏色的問題,都是快排的應用,所以,有時候學習演算法,確實需要理解它背後的原理,而不僅僅是會寫出這一個問題的代碼。
第k大元素