题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
练习地址
lc
实现-
/** 40 最小的k个数*/
public class C40_array_TopK {
//方法2:堆排序时间复杂度为O(nlogn),空间O(1)
public static ArrayList<Integer> getLeastTopK(int[] array, int k) {
if (array == null || array.length == 0 || k > array.length || k == 0) {
return null;
}
ArrayList<Integer> res = new ArrayList<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);//o1.compareTo(o2) 从小到大 反过来 从大到小 //return o2 - o1;
}
});
for (int i = 0; i < array.length; i++) {
if (maxHeap.size() != k) {
maxHeap.offer(array[i]);
} else if (maxHeap.peek() > array[i]) {
Integer temp = maxHeap.poll();
temp = null;
maxHeap.offer(array[i]);
}
}
for (Integer i : maxHeap) {
res.add(i);
}
return res;
}
}
Test
public static void main(String[] args) {
int[] array={4,5,1,6,2,7,3,8};
ArrayList<Integer> res = getLeastTopK(array,4);
for (Integer i : res) {
System.out.print(i+" ");
}
}
lc
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if (arr == null || arr.length == 0 || k >arr.length||k==0) {
return new int[0];
}
PriorityQueue<Integer> heapSort = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
for (int i = 0; i < arr.length; i++) {
if (heapSort.size() != k) {
heapSort.offer(arr[i]);
} else if (heapSort.peek() > arr[i]) {
heapSort.poll();
heapSort.offer(arr[i]);
}
}
int[] res = new int[k];
int j = 0;
for (Integer i : heapSort) {
res[j++] = i;
}
return res;
}
}