剑指offer--最小的k个数

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue;
/*
 * 思路一:
 * 用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。
 */
public class Main34 {

	public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
		ArrayList<Integer> arr = new ArrayList<Integer>();
        if(k<=0||k>input.length) {
        	return arr;
        }
        PriorityQueue<Integer> maxHeap = 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(maxHeap.size()!=k) {
        		maxHeap.offer(input[i]);
        	}else if(maxHeap.peek()>input[i]) {
        		Integer poll = maxHeap.poll();
        		poll=null;
        		maxHeap.offer(input[i]);
        	}
        }
        for(Integer num : maxHeap) {
        	arr.add(num);
        }
		return arr;
    }
	
	public ArrayList<Integer> GetLeastNumbers_SolutionII(int [] input, int k) {
		ArrayList<Integer> arr = new ArrayList<Integer>();
        if(input==null||k<=0||k>input.length) {
        	return arr;
        }
		Arrays.sort(input);
        for(int i=0;i<k;i++) {
        	arr.add(input[i]);
        }
		return arr;
    }
	public static void main(String[] args) {
		int[] res = {4,5,1,6,2,7,3,8};
		ArrayList<Integer> getLeastNumbers_Solution = new Main34().GetLeastNumbers_Solution(res,4);
		System.out.println(getLeastNumbers_Solution);
	}
}

  

posted @ 2018-05-19 09:24  dreamy_java  阅读(160)  评论(0编辑  收藏  举报