首页 > 其他 > 详细

[Leetcode] Heap, Divide and conquer--215. Kth Largest Element in an Array

时间:2017-06-19 14:12:25      阅读:350      评论:0      收藏:0      [点我收藏+]

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.

 

Solution:

 1st method using quicksort to sort in non-ascending order, and get the kth number. n = len(nums), time complexity is o(nlogn) -

 

 2nd method. quickselect. set the pivot (e.g. the first element ) and rearrange all the element less than pivot to be in the left, bigger than pivot to be in the right; then compare with the pivot index with k to decide to go next in the left part or right part to recursively do the same thing reference introduction to algorithm texbook or --reference https://en.wikipedia.org/wiki/Selection_algorithm https://discuss.leetcode.com/topic/14611/java-quick-select/2 random algorithm ; Amortized time complexity is o(n), worst case is o(n^2)

 1  def select(nums, l, r, index):
 2             if r == l:
 3                 return nums[l]
 4             #pivot index
 5             pind = random.randint(l, r)
 6             nums[l], nums[pind] = nums[pind], nums[l]   #move pivot to the beginning of the
 7             
 8             #partition around pivot
 9             i = l
10             for j in xrange(l+1, r+1):
11                 if nums[j] < nums[l]:
12                     i += 1
13                     nums[i], nums[j] = nums[j], nums[i]
14             nums[i], nums[l] = nums[l],nums[i] 
15             
16             if index == i:
17                 return nums[i]
18             elif index < i:
19                 return select(nums, l, i-1, index)
20             else:
21                 return select(nums, i+1, r, index)
22             
23         index = len(nums) - k
24         if nums is None or len(nums) < 1:
25             return 0
26         return select(nums, 0, len(nums)-1, index)

 

 3rd method, use heap if built-in heapq is allowed in python,

1 h = []
2         for n in nums:
3             heapq.heappush(h, -1*n)     #min-heap
4             
5         for i in range(0, k-1):
6             heapq.heappop(h)
7             
8         return -1*heapq.heappop(h)

 

4th - another method that I have not come up with, which is to use multiset, similar to heap ( it is interesting). --reference https://www.liuchuo.net/archives/3016.

[Leetcode] Heap, Divide and conquer--215. Kth Largest Element in an Array

原文:http://www.cnblogs.com/anxin6699/p/7048263.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!