题目

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

思路

堆排序。用前K个数建立最大堆,每次用堆顶元素和n-k中各个元素比较,如果堆顶元素较大,则互换位置,然后调整堆,使之重新成为最大堆。时间复杂度O(n*logk)

代码1(堆排序)

import java.util.ArrayList;
public class Solution {
   
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
   
        
        ArrayList<Integer> returnList = new ArrayList<>();
        if(input == null || input.length ==0 || k <1 || k>input.length){
   
            return returnList;
        }
        int[] ks = new int[k];
        for(int i =0;i<k;i++){
   
            ks[i] = input[i];
        }
        for(int i =(ks.length-1)/2;i>=0;i--){
   
            toHeap(ks,i,ks.length);
        }
        for(int i =k;i<input.length;i++){
   
            if(input[i] < ks[0]){
   
                ks[0] = input[i];
                toHeap(ks,0,ks.length);
            }
        }
        for(int i =0;i<k;i++){
   
            returnList.add(ks[i]);
        }
        return returnList;
    }
    public void toHeap(int [] input,int start,int end){
   
        int index = start;
        int left = index*2+1;
        int right = index*2+2;
        while(left < end && input[left] > input[index]){
   
            index = left;
        }
        while(right < end && input[right] > input[index]){
   
            index = right;
        }
        if(index !=start){
   
            int temp = input[start];
            input[start] = input[index];
            input[index] = temp;
            toHeap(input,index,end);
        }
    }
}

关键代码

        int[] ks = new int[k];
        // 最先遍历的k个数放入数组中 o(k)
        for (int i = 0; i < k; i++) {
   
            ks[i] = ins[i];
        }
        int half = (ks.length-1) / 2;
        for (int i = half; i >= 0; i--) {
   
            maxHeap(ks, ks.length, i);
        }

代码2 找一个放置的空间

public  ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
   
    List<Integer> list = new ArrayList<Integer>();
    if (k>input.length || k==0) {
   
        return (ArrayList)list;
    }
 
    for (int i = 0; i < k; i++) {
   
        list.add(input[i]);
    }
    for (int i = k; i < input.length; i++) {
   
 
        Collections.sort(list);
        if(input[i] < list.get(k-1)){
   
            list.set(k-1, input[i]);
        }
    }
    return (ArrayList)list;
}

代码3 PriorityQueue

public static void main(String[] args) {
   
    int [] input = {
   4,5,1,6,2,7,3,8};
    System.out.println(GetLeastNumbers_Solution(input,4));
}
 
public static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
   
    ArrayList<Integer> list = new ArrayList<>();
    if (input == null || k <= 0 || k > input.length || input.length==0) {
   
        return list;
    }
    PriorityQueue<Integer> pq = new PriorityQueue<>(k, new Comparator<Integer>(){
   
        @Override
        public int compare(Integer o1, Integer o2){
   
            return o2 - o1;
        }
    });
    for(int i=0; i<input.length; i++){
   
        if(pq.isEmpty() || pq.size()<k)
        {
   
            pq.add(input[i]);
        }
        else{
   
            if(input[i]<pq.peek()){
   
                pq.poll();
                pq.add(input[i]);
            }
        }
    }
    while(!pq.isEmpty()){
   
        list.add(pq.poll());
    }
    return list;
}

优质文章推荐
1.计算机网络----三次握手四次挥手
2.一篇让你彻底了解http请求报文和响应报文的结构
3.梦想成真-----项目自我介绍
4.一篇让你彻底了解HTTP 的前世今生
5.一篇让你彻底搞定HTTP方法与状态码
6.你们要的设计模式来了
7.震惊!来看《这份程序员面试手册》!!!
8.一字一句教你面试“个人简介”
9.接近30场面试分享