剑指offer(二十九)——最小的K个数

剑指offer(二十九)——最小的K个数

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

题解

一解:

对数组进行排序,使用set进行去重,输出前K个数。

  • 至于排序方法,可以自己写,也可以直接用API,排序方法影响时间复杂度。
	public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
    	ArrayList<Integer> resultList = new ArrayList<>();
    	Set<Integer> set = new HashSet<Integer>();
    	Arrays.sort(input);
    	for(int i = 0; i < input.length; i++) {
    		set.add(input[i]);
    	}
    	if (k > set.size()) {
			return resultList;
		}
    	Iterator<Integer> it = set.iterator();
    	while(k-- != 0) {
    		resultList.add(it.next());
    	}
    	return resultList;
    }
二解:

第二种解法是使用最大堆,先压入K个数,再用堆顶的最大值进行比较,替换更小值,最后剩下来的K个数就是最小的了。

  • 实测堆会去重,所以不用担心重复数的问题。
  • 另一个值得注意的地方是堆并不会排序,所以遍历最大堆出来的元素并不一定有序,但堆顶肯定是最大值。就用了一个笨办法,用栈将堆一个个弹出,然后再存回数组。
	public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
    	ArrayList<Integer> resultList = new ArrayList<>();
    	if (k > input.length || k == 0) {
			return resultList;
		}
    	
    	PriorityQueue<Integer> minqueue = new PriorityQueue<Integer>(k, new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
                return o2.compareTo(o1);
            }
		});
    	
    	for(int i = 0; i < input.length; i++) {
    		if (minqueue.size() != k) {
				minqueue.offer(input[i]);
			}else if (input[i] < minqueue.peek()) {
				minqueue.poll();
				minqueue.offer(input[i]);
			}
    	}
    	
    	Stack<Integer> stack = new Stack<>();
    	
    	while(minqueue.size() != 0) {
    		stack.add(minqueue.poll());
    	}
    	
    	while(stack.size() != 0) {
    		resultList.add(stack.pop());
    	}
    	
    	return resultList;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值