元素个数为K的大顶堆或者快速选择

最小的K个数

http://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf

请首先做参数合法性判断:k<=0或者k>input.length时,直接返回空

topK,先添加,当元素个数>k时,移除堆顶元素。

    /**
     *输入n个整数,找出其中最小的K个数。
     * 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
     * @param input n个整数
     * @param k K
     * @return 其中最小的K个数
     */
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        //首先请做合法性判断
        if(input==null||input.length==0||k<=0||k> input.length){
            return new ArrayList<>(0);
        }
        PriorityQueue<Integer> pq=new PriorityQueue<>(k,(a,b)->b.compareTo(a));
        for(int num:input){
            pq.add(num);
            if(pq.size()>k){
                pq.remove();
            }
        }
        return new ArrayList<>(pq);
        //或者,使用quickSelect。直接 return quickSelect(input, 0, input.length - 1, k - 1);


    }

    public ArrayList<Integer> quickSelect(int[] nums,int left,int right,int k){
        int pivotIndex=partation(nums,left,right);
        if(pivotIndex==k){
            ArrayList<Integer> res=new ArrayList<>();
            for(int i=0;i<=k;i++){
                res.add(nums[i]);
            }
            return res;
        }
        return pivotIndex>k?quickSelect(nums,left,pivotIndex-1,k):quickSelect(nums,pivotIndex+1,right,k);
    }

    private int partation(int[] nums,int left,int right){
        int pivot=nums[left];
        while (left<right){
            while (left<right&&pivot<=nums[right]){
                right--;
            }
            nums[left]=nums[right];
            while (left<right&&nums[left]<=pivot){
                left++;
            }
            nums[right]=nums[left];
        }
        nums[left]=pivot;
        return left;
    }

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务