您的位置:首页 > 其它

LeetCode215:数组中第K个最大元素

2019-08-27 12:01 330 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Einstellung/article/details/100097205

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例:输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

这个问题就是一个排序问题,下面尝试使用不同的排序方法来实现。

快速排序

class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
self.quickSortHelper(nums, 0, len(nums) - 1)

return nums[-k]

def quickSortHelper(self, nums, first, last):
if first < last:
splitPoint = self.partition(nums, first, last)

self.quickSortHelper(nums, first, splitPoint - 1)
self.quickSortHelper(nums, splitPoint + 1, last)

def partition(self, nums, first, last):

leftmark = first
rightmark = last
base = nums[first]

while leftmark < rightmark:

if nums[leftmark] <= base:
leftmark += 1

if nums[rightmark] >= base:
rightmark -= 1

else:
nums[leftmark], nums[rightmark] = nums[rightmark], nums[leftmark]

nums[rightmark], nums[first] = nums[first], nums[rightmark]

return rightmark

思路就是《剑指offer》中的Partition版本的一点微小改动。

堆排序

下面介绍一种堆排序的办法。事实上,在这个问题中,使用堆排序要效果更好。因为要输出倒数到k大个数,在使用堆排序的时候,如果我们构建的是最大堆,那么就会从最大值依次排序输出,而我们之前介绍的快排,一定要排好序之后才能找到倒数第k大个数,因此在这个问题中,相比于快排,堆排序效率更高。

在Python中,有一个包叫heapq,就可以帮我们建立堆这个数据结构。因此,我们使用这个包来实现堆排序就简单多了。

heapq介绍

但是这个heapq默认是构建最小堆,而不是最大堆。我们这里要输出倒数第k大个数。做法很简单。我们构建堆的时候,把数字颠倒过来。最大的数变成最小的数,这样堆排序按照最小堆输出的时候,再添加一个负号,实际上又颠倒过来了,这样就相当于按照最大堆来输出了。下面是代码:

class Solution(object):
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
from heapq import heappush, heappop
h = []
for i in nums:
heappush(h, -i)

for i in range(0, k-1):
heappop(h)

return -heappop(h)

a = Solution()
nums = [1, 2,4,5, 3]
a.findKthLargest(nums, 2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: