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.

Note: 
You may assume k is always valid, 1 ≤ k ≤ array's length.

本题开始我用了数组排序的方法做,代码如下:

public class Solution {

    public int findKthLargest(int[] nums, int k) {

        Arrays.sort(nums);

        int kth = 0;

        for(int i=nums.length-1;i>=0;i--){

            k--;

            if(k==0) kth = nums[i];

        }

        return kth;

    }

}

后来我又用了大顶堆的概念来做,代码如下:

public class Solution {

    public int findKthLargest(int[] nums, int k) {

        PriorityQueue<Integer> q = new PriorityQueue<Integer>(nums.length,new Comparator<Integer>(){

            public int compare(Integer a,Integer b){

                return b-a;

            }

        });

        for(int i:nums){

            q.offer(i);

        }

        k--;

        while(k>0){

            q.poll();

            k--;

        }

        return q.peek();

    }

}

大神用了快速排序法来做,很聪明的解题办法,代码如下:

public class Solution {

    public int findKthLargest(int[] nums, int k) {

        int n = nums.length;

        int q = quickselect(nums,0,n-1,n-k+1);

        return nums[q];

    }

    public void swap(int[] nums,int i,int j){

        int temp = nums[i];

        nums[i] = nums[j];

        nums[j] = temp;

     }

     public int quickselect(int[] nums,int lo,int hi,int k){

         int pivot = nums[hi];

         int i = lo;

         int j = hi;

         while(i<j){

             if(nums[i++]>pivot) swap(nums,--i,--j);

         }

         swap(nums,i,hi);

         int order = i-lo+1;

         if(order==k) return i;

         else if(order>k) return quickselect(nums,lo,i-1,k);

         else return quickselect(nums,i+1,hi,k-order);

     }

}

posted @ 2017-02-02 08:08  CodesKiller  阅读(154)  评论(0编辑  收藏  举报