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.
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
思路:使用快拍的partition函数:
- O(N) best case / O(N^2) worst case running time + O(1) memory
The smart approach for this problem is to use the selection algorithm (based on the partion method - the same one as used in quicksort).
快速排序算法里的partition函数用来解决这样一个问题:给定一个数组arr[]和数组中任意一个元素a,重排数组使得a左边都小于它,右边都不小于它。
start、end分别为数组第一个元素和最后一个元素的索引
// povitIndex为数组中任意选中的数的索引
class Solution(object):
def partition(self,nums,start,end):
pivot = nums[end]
temp = start
for i in range(start,end):
if nums[i] < pivot:
#print nums[i]
nums[i],nums[temp] = nums[temp],nums[i]
temp += 1
#print nums,temp
nums[end],nums[temp] = nums[temp],nums[end]
#print nums
return temp
def findKthLargest(self, nums, k):
low = 0
high = len(nums) - 1
k = len(nums) - k
#print k
while low < high:
j = self.partition(nums,low,high)
#print j
if j < k:
low = j + 1
elif j > k:
high = j - 1
else:
break
return nums[k]
'''
nums.sort()
return nums[-k]
'''
"""
:type nums: List[int]
:type k: int
:rtype: int
"""