Find K-th largest element in an array. and N is much larger than k.
Notice You can swap elements in the array
Example:
In array [9,3,2,4,8], the 3rd largest element is 4.
In array [1,2,3,4,5], the 1st largest element is 5, 2nd largest element is 4, 3rd largest element is 3 and etc.
classSolution{/** * @paramnums an integer unsorted array * @paramk an integer from 1 to n * @return the kth largest element*/publicintkthLargestElement2(int[]nums,intk){if(nums ==null||nums.length==0)return-1;returnquickSelect(nums, k -1);} // 这个函数是精髓,使用while循环避免过程中需要改变k的值privateintquickSelect(int[]nums,intk){int p =0, r =nums.length-1;while(p < r){int q =partition(nums, p, r);if(q == k)return nums[q];if(q < k){ p = q +1;}else{ r = q -1;}}return nums[p];}privateintpartition(int[]nums,intp,intr){int pivot = nums[r];int i = p -1;for(int j = p; j < r; j++){if(nums[j]>= pivot)swap(nums,++i, j);}swap(nums,++i, r);return i;}privatevoidswap(int[]nums,inti,intj){int t = nums[i]; nums[i]= nums[j]; nums[j]= t;}}
class Solution:
# @param nums {int[]} an integer unsorted array
# @param k {int} an integer from 1 to n
# @return {int} the kth largest element
def kthLargestElement2(self, nums, k):
import heapq
# 维持k个当前最大值的pq,应该用minheap,每次和当前k个最大中最小的比较
pq = []
for num in nums:
heapq.heappush(pq, num)
if len(pq) > k:
heapq.heappop(pq)
return pq[0]