[Question]
已知一个几乎有序的数组,几乎有序是指如果把数组排好序的话,每个元素移动的距离可以不超过K,并且K相对于数组来说比较小。
[Idea]
使用优先级队列结构 PriorityQueue length=K+1
首先将数组前"K+1"个数add进 PriorityQueue
其次循环 add 数组下一个数 并 poll up 数组第一个数
[Source code]
import java.util.PriorityQueue;
public class code04_SortArrayDistanceLessK {
public static void sortArrayDistanceLessK(int[] array, int k) {
if (array == null || array.length < 2) {
return;
}
PriorityQueue<Integer> heap = new PriorityQueue<>();
int index = 0;
for (; index < Math.min(array.length - 1, k); index++) {
heap.add(array[index]);
}
int i = 0;
for (; index < array.length; i++, index++) {
heap.add(array[i]);
array[i] = heap.poll();
}
while (!heap.isEmpty()) {
array[i++] = heap.poll();
}
}
}