首页 > 技术文章 > 215. Kth Largest Element in an Array

codeskiller 2017-02-02 08:08 原文

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);

     }

}

推荐阅读