215. 数组中的第K个最大元素

速度比较:
做完整的快排<<<不做完整的快排<<自建堆<不做完整的且随机选择哨兵的快排

贴上最快的代码:

class Solution {
    int[] nums;
    public int findKthLargest(int[] nums, int k) {
     this.nums=nums;
     quickSort(0,nums.length-1,k);
     return nums[k-1];
    }
    void quickSort(int left,int right,int k){
        if(left>=right)return;
        int pos=(int)(Math.random()*(right-left+1))+left;
        int pivot=nums[pos];
        int tmp=0;
        tmp=nums[left];
        nums[left]=nums[pos];
        nums[pos]=tmp;
        int i=left;
        int j=right;
        while(i<j){
            while(i<j&&nums[j]<=pivot)j--;
            nums[i]=nums[j];
            while(i<j&&nums[i]>=pivot)i++;
            nums[j]=nums[i];
        }
        nums[i]=pivot;
        if(i>k-1)quickSort(left,i-1,k);
        if(i<k-1)quickSort(i+1,right,k);

    }
}

当然也可以自建堆做:

class Heap{
    int[] data;
    int size;
    Heap(int[] data){
        this.data=data;
        size=data.length;
        Heappify();
    }
    void swap(int i,int j){
        int tmp;
        tmp=data[i];
        data[i]=data[j];
        data[j]=tmp;
    }
    int properParent(int i,int j,int k){
        int maxpos=i;
        if(j<size&&data[i]<data[j])//处理越界
          maxpos=j;
        
        if(k<size&&data[maxpos]<data[k])
            maxpos=k;
         return maxpos;   
    }
    void Heappify(){
        for(int i=(size-2)/2;i>=0;i--){
            percolateDown(i);
        }

    }
    int delMax(){
       int ans=data[0];
       swap(0,size-1);
       size--;
       percolateDown(0);
       
       return ans;
    }
    int  percolateDown(int pos){
        int j;
        while(pos!=(j=properParent(pos,2*pos+1,2*pos+2))){
            swap(pos,j);
            pos=j;
        }
        return pos;
    }
}
class Solution {
    public int findKthLargest(int[] nums, int k) {
        Heap heap=new Heap(nums);
        int ans=0;
        for(int i=0;i<k;i++){
            ans=heap.delMax();
        }
        return ans;
    }
}
上一篇:一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做


下一篇:215. 数组中第K个最大元素