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默认是构建最小堆,而不是最大堆。我们这里要输出倒数第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)
相关文章推荐
- 在一个无序数组中找到第K个最小或者最大的元素
- 算法题目总结——数组中第k个最大元素
- 数组中的第K个最大元素(TopK问题)
- 【PHP解法==LeetCode对撞指针类型问题】11. 盛最多水的容器 && 215.数组中的第K个最大元素
- leetcode刷题215 数组中的第K个最大元素
- 3、数组中的第K个最大元素
- 215. 数组中的第K个最大元素
- LeetCode215. python实现:数组中的第K个最大元素问题☆☆
- LeetCode题解 | 215. 数组中的第K个最大元素
- 215. 数组中的第K个最大元素
- 【LeetCode.215】数组中的第K个最大元素
- LeetCode 3 数组中的第K个最大元素
- Leetcode题库-数组中的第K个最大元素(java语言版)
- [Leetcode] 215. 数组中的第K个最大元素 java
- Leetcode:215. 数组中的第K个最大元素(快排)/考察对排序算法的掌握
- 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
- 16.java语言基础-获取数组最大和最小元素
- 用递归的方法求数组中元素的最大值和最小值
- 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- 求数组中第K个最大的值