寻找第K大

寻找第K大

http://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf

方法一 最大堆

建立一个最大堆,把数据存进去,堆顶元素是最大的;
poll() k个数,最后一次poll出来的就是第K大的数。

import java.util.*;
public class Solution  {
    public int findKth(int[] a, int n, int K) {
        // write code here
        if (n < K)
            return -1;
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>((e1, e2) -> {
            return e2 - e1;
        });//大顶堆
        for (int i = 0; i < n; i++) {
            maxHeap.add(a[i]);
        }
        int res = 0;
        for (int i = 0; i < K; i++) {
            res = maxHeap.poll();
        }
        return res;
    }
}

方法二 快排思想

import java.util.*;

public class Solution  {
    public int findKth(int[] a, int n, int K) {
        // write code here
        if (n < K)
            return -1;
        return findKth(a, 0, a.length - 1, K);
    }
    private int findKth(int[] a, int start, int end, int k) {
        if (start <= end) {
            int pivot = Partition(a, start, end);//下标位置
            if (k - 1 == pivot) {
                return a[pivot];
            }
            else if (pivot < k - 1) {
                return findKth(a, pivot + 1, end, k);
            }
            else {
                return findKth(a, start, pivot - 1, k);
            }
        }
        return -1;
    }

    private int Partition(int[] a, int start, int end) {
        int left = start;
        int right = end;
        int pivot = a[left];
        //把比pivot大的移到左边,小的移到右边
        while (left < right) {
            while (left < right && a[right] <= pivot)
                right--;
            while (left < right && a[left] >= pivot)
                left++;
            if (a[left] < a[right]) {
                int temp = a[left];
                a[left] = a[right];
                a[right] = temp;
            }
        }
        a[start] = a[left];
        a[left] = pivot;
        return left;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务