前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LEETCODE】模拟面试-215. Kth Largest Element in an Array

【LEETCODE】模拟面试-215. Kth Largest Element in an Array

作者头像
杨熹
发布2018-04-03 15:04:27
6120
发布2018-04-03 15:04:27
举报
文章被收录于专栏:杨熹的专栏杨熹的专栏

图:新生大学

https://leetcode.com/problems/kth-largest-element-in-an-array/

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)

代码语言:javascript
复制
public class Solution {
    public int findKthLargest(int[] nums, int k){
    if ( nums == null || nums.length < k ){
        return Integer.MIN_VALUE;
    }
    
    //method: maintain a min heap with size k
    PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(k, new MyComparator());
    
    //1.add first k elements
    for ( int i = 0; i < k; i++ ){
        minHeap.offer(nums[i]);
    }
    
    //2.compare remain elements, add
    for ( int i = k; i < nums.length; i++ ){
        if ( nums[i] > minHeap.peek() ){
            minHeap.poll();
            minHeap.offer(nums[i]);
        }
    }
    
    return minHeap.poll();
    
}

class MyComparator implements Comparator<Integer>{
    @Override
    public int compare(Integer o1, Integer o2){
        if ( o1.equals(o2) ){
            return 0;
        }else{
            //from small to large, minHeap
            return o1 - o2;
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.01.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档