无序数组中找top K 个值

在不增加空间复杂度的情况下,用堆排序。维护一个大小为k的堆。如果是找最大的K个值,那么用大顶堆,否则用小顶堆。
先从原数组中取k个值建立一个堆,然后每次从原数组中拿一个值与堆顶元素进行比较,看是否需要替换,如果替换了,就进行一次堆排序。这样到最后,这个堆中的元素就是top K。

前K大,维护最小堆;前K小,维护最大堆
1.初始化一个最小堆
2.输入新数据,若大于堆顶则替换堆顶,调整堆为最小堆(从最后一个父节点开始调整)
3.遍历完数据,遍历完数据,堆中数据即为所求
复杂度O(n*logK)

可以参考下面的代码。

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int[] topK = new int[k];
        for(int i=0; itopK[0]){
                topK[0] = nums[j];
                sort(topK, 0, k);
            }
        }
        return topK[0];
    }
    public void sort(int[] nums, int index, int size){
        int i = index;
        int j = 2*index+1;
        while(jnums[j+1])
                j++;
            if(nums[i]=0; i--){
            sort(nums, i, nums.length);
        }
        // for(int i=1; i

还有递归版的:

class Solution {
    public List topKFrequent(int[] nums, int k) {
        List res=new ArrayList<>();
//      先用hashmap统计词频
        HashMap map=new HashMap<>();
        for(int i=0;i=0;i--){
            adjust(nums,length,i);
        }
    }
//    查找topK
    public int[] topK(int[] nums,int k){
        int top[]=new int[k];
        for(int i=0;itop[0]){
                top[0]=nums[j];
                adjust(top,k,0);
            }
        }
        return top;
    }
}

参考:
https://blog.csdn.net/Z_Y_D_/article/details/84646443

你可能感兴趣的:(LeetCode刷题整理)