在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
归并排序
class Solution(object):
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
nums = self.mergeSort(nums)
return nums[k-1]
def mergeSort(self, nums):
if len(nums) <= 1:
return nums
n = len(nums)-1
mid = n >> 1
left = self.mergeSort(nums[:mid+1])
right = self.mergeSort(nums[mid+1:])
sorted_nums = []
while left and right:
if left[0] >= right[0]:
sorted_nums.append(left.pop(0))
else:
sorted_nums.append(right.pop(0))
if left:
sorted_nums = sorted_nums + left
else:
sorted_nums = sorted_nums + right
return sorted_nums
最大堆
class Solution(object):
def findKthLargest(self, nums, k):
def maxHeap(nums, i, length):
l = 2*i+1
r = 2*i+2
large = i
if l < length and nums[l] > nums[large]:
large = l
if r < length and nums[r] > nums[large]:
large = r
if i != large:
nums[i],nums[large] = nums[large], nums[i]
maxHeap(nums,large,length)
def buildMaxHeap(nums, length):
for i in range(length/2,-1,-1):
maxHeap(nums,i,length)
heapSize = len(nums)
buildMaxHeap(nums,heapSize)
for i in range(heapSize-1,heapSize-k,-1):
nums[0],nums[i] = nums[i], nums[0]
heapSize -= 1
maxHeap(nums, 0, heapSize)
return nums[0]
我们也可以使用堆排序来解决这个问题——建立一个大根堆,做 k−1 次删除操作后堆顶元素就是我们要找的答案。首先我们需要建立一个最大堆。对于一个二叉堆来讲,我们需要对所有的非叶子节点的根节点进行下沉。具体的步骤是比对他的左右儿子,如果是最大堆我们需要大的数字在上面,小的数字在下面,那么如果根节点比两个儿子都大,则不发生变化,如果比儿子小就会发生下沉,并且是与较大的那个儿子节点进行交换,在交换完毕后再对其交换的节点进行递归调用,最后一直下沉直到不能下沉为止。当我们遍历完所有的非叶节点之后,最大堆就构建完成了。之后我们只要每次从堆顶删除一个最大值(其实是将其与堆的最后一个叶子进行互换,然后让size-1),然后从最顶开始调整,进行k-1次后,此时在堆顶的就是第k大的元素了。