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;i<len;i++){
            queue.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(left<right){
            while(right>left&&key>=t[right])
                right--;
            t[left]=t[right];
            while(left<right&&key<=t[left])
                left++;
            t[right]=t[left];
        }
        t[left]=key;
        int 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大的。
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值