LeetCode 215. 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.
  • 解法一:该题解法很多,求第k个大的,优先想到的是维护一个大小为k的优先队列,因为Java里面的优先队列(PriorityQueue),PriorityQueue 实际上是一个堆,默认情况下是一个最小堆,因为不允许有null,且元素必须是可排序的(抽象类型的可自定义Comparator)。代码如下:
 public int findKthLargest(int[] nums, int k) {
        int len=nums.length;
        PriorityQueue queue=new PriorityQueue<>(k);
        for(int i=0;iqueue.offer(nums[i]);
            if(queue.size()>k)
                queue.poll();
        }
        return (int)queue.peek();
    }
  • 解法二:改进的快排,在快速排序中首先选择一个基准值,然后将大于该值的放在这个基准值的左边,小于的放在右边,即使用从大到小排,假设第一次排序后如下:
    [ ][ ][ ]…. [key] …[ ][ ] .此时key左边的个数如果恰好等于k,则直接返回key的值,如果左边的个数比k 大,说明第k大的肯定在左边数组,如果左边个数比k小,则第k大的一定在右边,但是此时注意,此时在右边数组中不是找第k大的,而是找 klen() 。代码如下:
public int findKthLargest(int[] nums, int k) {
        int len=nums.length;
        return quickSort(nums,0,len-1,k);
    }
    public int quickSort(int [] t,int start,int end,int k){
        if(start>=end)
            return t[start];
        int key=t[start];
        int left=start;
        int right=end;
        while(leftwhile(right>left&&key>=t[right])
                right--;
            t[left]=t[right];
            while(leftint m=left-start+1;// <=key 的数量
        if(m==k)
            return key;
        if(m>k)
            return quickSort(t, start, left-1,k);
        else
            return quickSort(t, left+1, end,k-m); //在右边找第k-m大的。
    }

你可能感兴趣的:(数据结构与算法)