简谈” Top K“

Top K

快速选择和堆排序都可以求解 Kth Element 和 TopK Elements 问题。
题见215. Kth Largest Element in an Array (Medium)

partition划分法

public int findKthLargest(int[] nums, int k) {
    int j = -1;
    int left = 0,right = nums.length - 1;
    int target = right - k + 1;
    while (j != target){
        j = partition(nums,left,right);
        if(j == target)
            return nums[j];
        else if(j < target){
            left = j + 1;
        }
        else {
            right = j - 1;
        }
    }
    return nums[j];
}
//leetcode中看到的划分方法,简单易懂
public int partition(int[] nums,int start,int end){
    int pivot  = nums[start];
    int j = start;
    for(int i = start + 1;i <= end;i++){
        if(nums[i] < pivot){
            j++;
            swap(nums,i,j);
        }
    }
    swap(nums,j,start);
    return j;
}
//经典快排划分方法,见《算法》和cyc2018
public int partition_custom(int[] nums,int start,int end){
    int left = start,right = end + 1;
    int pivot = nums[start];
    while (true){
        while (left < end && nums[++left] <= pivot);
        while (right > start && nums[--right] >= pivot);//right永远不会超出范围
        if(left >= right)
            break;
        swap(nums,left,right);
    }
    swap(nums,right,start);
    return right;
}

private void swap(int[] nums, int index1, int index2){
    int temp = nums[index1];
    nums[index1] = nums[index2];
    nums[index2] = temp;
}

堆排序

public int findKthLargest_heap(int[] nums, int k) {
    PriorityQueue<Integer> heap = new PriorityQueue<>();
    for(int i = 0;i < nums.length;i++){
        heap.offer(nums[i]);
    }
    for (int i = 0;i < nums.length - k;i++){
        heap.poll();
    }
    return heap.peek();
}
posted @ 2019-08-29 21:42  wunsiang  阅读(94)  评论(0编辑  收藏  举报