【LEETCODE】模擬面試-215. Kth Largest Ele

lotus_ruan發表於2021-09-09

圖片描述

圖:新生大學

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.

**input: **an unsorted array, an integer k
output: return an integer, which is the kth largest in the given array, including duplicates
corner: when the array is null, or its length is less than k, there is no such element

The primitive idea is to sort the array, and count the kth element, if we use merge sort, it will take O(n logn), plus O(k) to count.

Or we can optimize that we just sort the largest k elements, ignoring the remain n-k elements. It will raise the Heap structure, since it's fast to find the largest element.

So, we scan from left to right in the array, first put k elements into a heap to heapify. Time is O(k)
This heap is a minHeap where its top is the smallest.
Every time we scan an element in the array, we compare it with the top of the heap.
If it's smaller than or equal to top, we keep moving on.
If it's larger than top, we pop the top, and put it in the top, and main the heap to be a minHeap. Time is O(logk)
After we scanned all the elements in the array, we just need to pop the top, which is the right largest one. Need to compare n - k times.

Finally, time complexity is O((n - k)logk + k)
space is O(k)

public class Solution {    public int findKthLargest(int[] nums, int k){    if ( nums == null || nums.length  minHeap = new PriorityQueue(k, new MyComparator());    
    //1.add first k elements
    for ( int i = 0; i  minHeap.peek() ){
            minHeap.poll();
            minHeap.offer(nums[i]);
        }
    }    
    return minHeap.poll();
    
}class MyComparator implements Comparator{    @Override
    public int compare(Integer o1, Integer o2){        if ( o1.equals(o2) ){            return 0;
        }else{            //from small to large, minHeap
            return o1 - o2;
        }
    }
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1762/viewspace-2806027/,如需轉載,請註明出處,否則將追究法律責任。

相關文章