题目:
一个几乎有序的数组。几乎有序是指:如果把数组排好序,每个数的移动距离一定不超过K,并且K一定远小于数组长度
分析:
给定的数组有上面的限制条件,根据条件可以分析得到:
对于前0-k个数如果排好序了,那么0位置一定是最小数,因为k位置后面的数无法移动到0位置
所以建立一个小根堆,大小为k+1,用于放置0-k的数
当堆满时,弹出堆顶,此时堆顶是当前需要排序的数列最小值,再将后续一个数入堆
后续数进来,弹出堆顶,再入堆
图解
code
public static void sortArrayDistanceLessK(int [] arr,int k){
if(k==0)return;
//小根堆,大小为k+1
//将数组前k+1个数入堆
int heapSize = Math.min(arr.length,k+1);
PriorityQueue<Integer> minHeap = new PriorityQueue();
int i = 0;
for (; i < heapSize; i++) {
minHeap.add(arr[i]);
}
int sortIndex = 0;
//弹出堆顶,新加入堆
for(;i<arr.length;i++){
arr[sortIndex++] = minHeap.poll();
minHeap.add(arr[i]);
}
while (!minHeap.isEmpty()){
arr[sortIndex++] = minHeap.poll();
}
}