問題描述
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,Given [3,2,1,5,6,4] and k = 2, return 5.
**Note: **You may assume k is always valid, 1 ≤ k ≤ array's length.
問題分析
題不難,主要是借此題目回顧一下堆和堆排。
思路是維護一個k大小的小頂堆,使這個小頂堆由當前最大的k個元素組成。
一篇關于堆的文章
- 堆的定義
大頂堆:每個節點的值都不大于其父節點的值;
小頂堆:每個節點的值都不小于其父節點的值。 - 堆的調整
對于某節點i,比較其與自身孩子節點2i+1、2i+2值的大小,決定是否調換,調換后要繼續在新位置比較與新位置孩子節點值的大小,直到到達合適位置。 - 堆的建立
從最后一個非孩子節點開始,由后向前對每一個非孩子節點進行調整。
AC代碼
class Solution(object):
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
self.build(nums, k)
for i in range(k, len(nums)):
if nums[i] > nums[0]:
nums[0] = nums[i]
self.adjust(nums, 0, k)
return nums[0]
def build(self, nums, k):
n = (k-2)/2
for i in range(n, -1, -1):
self.adjust(nums, i, k)
def adjust(self, nums, index, k):
i = index
while True:
index1 = 2 * i + 1
index2 = 2 * i + 2
if index1 >= k:
return
if index2 >= k:
if nums[i] > nums[index1]:
nums[i], nums[index1] = nums[index1], nums[i]
i = index1
else:
return
else:
index = index1 if nums[index1] < nums[index2] else index2
if nums[i] > nums[index]:
nums[i], nums[index] = nums[index], nums[i]
i = index
else:
return
Runtime: 68 ms, which beats 58.08% of Python submissions.