215.kth-largest-element-in-an-array-cn
题目地址
https://leetcode.com/problems/kth-largest-element-in-an-array/
题目描述
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.
Example 1:
Input: [3,2,1,5,6,4] and k = 2
Output: 5
Example 2:
Input: [3,2,3,1,2,4,5,5,6] and k = 4
Output: 4
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.思路
这道题要求在一个无序的数组中,返回第K大的数。根据时间复杂度不同,这题有3种不同的解法。
解法一 (排序)
很直观的解法就是给数组排序,这样求解第K大的数,就等于是从小到大排好序的数组的第(n-K)小的数 (n 是数组的长度)。
例如:
复杂度分析
时间复杂度: O(nlogn) - n 是数组长度。 空间复杂度: O(1) - 原数组排序,没有用到额外空间
解法二 - 小顶堆(Heap)
可以维护一个大小为K的小顶堆,堆顶是最小元素,当堆的size > K 的时候,删除堆顶元素. 扫描一遍数组,最后堆顶就是第K大的元素。 直接返回。
例如: 
复杂度分析
时间复杂度:O(n * logk) , n is array length
空间复杂度:O(k)
跟排序相比,以空间换时间。
解法三 - Quick Select
Quick Select 类似快排,选取pivot,把小于pivot的元素都移到pivot之前,这样pivot所在位置就是第pivot index 小的元素。 但是不需要完全给数组排序,只要找到当前pivot的位置是否是在第(n-k)小的位置,如果是,找到第k大的数直接返回。
具体步骤:

复杂度分析
时间复杂度:
平均是:
O(n)最坏的情况是:
O(n * n)
关键点分析
直接排序很简单
堆(Heap)主要是要维护一个K大小的小顶堆,扫描一遍数组,最后堆顶元素即是所求。
Quick Select, 关键是是取pivot,对数组区间做partition,比较pivot的位置,类似二分,取pivot左边或右边继续递归查找。
代码(Java code)
解法一 - 排序
解法二 - Heap (PriorityQueue)
解法三 - Quick Select
参考(References)
Last updated
Was this helpful?