天天看点

最小的k个数 - Java

最小的k个数 - Java

题目描述

给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组

示例1

输入
[4,5,1,6,2,7,3,8],4 
           
返回值
[1,2,3,4]
           

方法一(排序后,再取前k个值)

这个没什么好讲的,肯定不是最优解。

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result=new ArrayList<>();
        if(input.length>=k&&k>0){
            Arrays.sort(input);
            for(int i=0;i<k;i++){
                result.add(new Integer(input[i]));
            }
 
        }
        return result;
 
    }
}
           

方法二(堆排序)

使用大顶堆,大顶堆的peek()最大(即最大值在最顶部)。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> ret = new ArrayList<>();
        if(k==0 || k>input.length){
            return ret;
        }
        Queue<Integer> minheap =new PriorityQueue<Integer>(11, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        for(int value: input){
            if(minheap.size() < k){
                minheap.offer(value);
            }else{
                System.out.println(minheap.peek());
                if(value < minheap.peek()){
                    minheap.poll();
                    minheap.add(value);
                }
            }
        }
        while(!minheap.isEmpty()){
            ret.add(minheap.peek());
            minheap.poll();
        }
        return ret;
    }
}