import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
//利用 优先级队列结构
//创建 大根堆比较器
class MaxHeapComparator5 implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}
class MinKNumber {
//成员变量
//大根堆
private PriorityQueue<Integer> maxHeap;
//构造器
public MinKNumber() {
this.maxHeap = new PriorityQueue<>(new MaxHeapComparator5());
}
public PriorityQueue GetLeastNumbers_Solution(int[] arr, int k) {
if (k < 1 || k > arr.length) {
return null;
}
for (int i = 0; i != k; i++) {
this.maxHeap.add(arr[i]);
}
for (int i = k; i < arr.length; i++) {
if (this.maxHeap.peek()>arr[i]) {
this.maxHeap.poll();
this.maxHeap.add(arr[i]);
}
}
return maxHeap;
}
}
public class Test29 {
public static void swap(ArrayList<Integer> arr, int i, int j) {
if (i == j) {
return;
}
arr.set(i, arr.get(i) ^ arr.get(j));
arr.set(j, arr.get(i) ^ arr.get(j));
arr.set(i, arr.get(i) ^ arr.get(j));
}
public static void heapInsert(ArrayList<Integer> arr, int index) {
//如果父节点
while (arr.get((index - 1) / 2) < arr.get(index)) {
swap(arr, index, (index - 1) / 2);
index = (index - 1) / 2;
}
}
public static void heapModify(ArrayList<Integer> arr, int index, int heapSize) {
int left = index * 2 + 1;//左孩子
while (left < heapSize) {
int largest = left + 1 < heapSize && arr.get(left) < arr.get(left + 1) ? left + 1 : left;
largest = arr.get(index) < arr.get(largest) ? largest : index;
if (index == largest) {
break;
}
swap(arr, index, largest);
index = largest;
left = index * 2 + 1;
}
}
public static ArrayList<Integer> GetLeastNumbers_Solution(int[] arr, int k) {
if (arr == null || arr.length < 1 || k < 1 || k > arr.length) {
return null;
}
//int[] help = new int[k];
ArrayList<Integer> help = new ArrayList<>(k);
//遍历 数组 调整成大根堆
for (int i = 0; i != k; i++) {
help.add(arr[i]);
heapInsert(help, i);
}
for (int i = k; i < arr.length; i++) {
if (help.get(0) > arr[i]) {
help.set(0, arr[i]);
heapModify(help, 0, k);
}
}
return help;
}
public static int[] genericRandomArray(int size) {
if (size < 1) {
return null;
}
int[] arr = new int[(int) (Math.random() * (10))];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((Math.random() * (size + 1)) - (int) (Math.random() * size));
}
return arr;
}
public static void main(String[] args) {
int[] arr = new int[]{ 6, 9, 8, 7,5, 4, 3, 2, 1};
MinKNumber minKNumber=new MinKNumber();
PriorityQueue priorityQueue = minKNumber.GetLeastNumbers_Solution(arr, 5);
System.out.println(priorityQueue);
}
}
找最小k个数
最新推荐文章于 2022-08-02 16:50:09 发布