This one's O(n lg k) based intuitively on a minHeap where n is the number of elements in nums and k is k which is usually much smaller than n.
class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> minHeap = new PriorityQueue<>(); for (int e: nums) { minHeap.add(e); if (minHeap.size()>k) minHeap.remove(); } //Now minHeap contains largest k elements of all. return minHeap.remove(); } }
As a plus point, this code submitted by me works very well for unlimited amounts of streaming in data for an online algorithm too!
Were we to find the Kth Smallest element from an unsorted array, we would have used a maxHeap to store the smallest K of all the elements into it, evicting the maximum of them all every time the size of heap exeeded K.
In that case, we would have modified the PriorityQueue at creation time with a custom comparator using either of the following:
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder()); queue.offer(1);
PriorityQueue<Integer> maxHeap
=new PriorityQueue<>((x, y) -> Integer.compare(y, x));Note that a lambda comparator like (x, y) -> y - x may be not appropriate for long integers due to overflow. For example, numbers y = Integer.MIN_VALUE and x = 5 results in positive number. It is better to use new PriorityQueue<>((x, y) -> Integer.compare(y, x)).
No comments:
Post a Comment