随机数组中前k小的数,按顺序输出。

最小的K个数

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

坑点:k会大于数组长度,这个时候要输出空的ArrayList。

第一感觉就是先排序然后取前k个就完了。。。。时间复杂度就是快排的时间复杂度。
但是这样有个问题,数组太长排序会比较非内存。
合理的解法:取数组的前k个维护一个集合A,然后遍历后续的其他数,如果其他数中有比A中最大值还要大的数字,那就把这个数字替换掉A的最大值。最后得到的集合A中就存的是最小的k个数了。排个序就好了。
如果说每次去找A中的最大值比较费时,可以降序的优先队列,在输出结果的时候poll也是有序的。

普通解法

import java.util.Arrays;
import java.util.ArrayList;

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

更好的解法

import java.util.*;

public class Solution {

    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> arr = new ArrayList<>();
        if(k>input.length||k==0){
            return arr;
        }

        PriorityQueue <Integer> pQueue = new PriorityQueue<>(k, Comparator.reverseOrder());
        for(int i=0;i<k;i++){
            pQueue.add(input[i]);
        }
        for(int i=k;i<input.length;i++){
            if(input[i]<pQueue.peek()){
                pQueue.poll();
                pQueue.add(input[i]);
            }
        }
        LinkedList<Integer> list = new LinkedList<>();
        for(int i=0;i<k;i++){
            list.addLast(pQueue.poll());
        }
        arr.addAll(list);

        return arr;

    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 11:00
点赞 评论 收藏
分享
水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务