剑指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); } }