思路如下:
1、创建两个PriorityQueue,一个堆内存储“大于等于中位数的数”,一个堆存储“小于等于中位数的数”。
根据堆的性质,堆的首元素总是当前堆内元素的最小值,不停的poll交叉插入数组即可得到最终结果。
2、边界条件是nums长度为0或者1
3、注意考虑nums长度为奇数或者偶数的情况,如果是奇数就先放小的数,偶数就先放大的数(从最右边开始放的话)
class Solution {
public void wiggleSort(int[] nums) {
if(nums.length==0||nums.length==1){
return;
}
PriorityQueue<Integer> queue1=new PriorityQueue<>();
PriorityQueue<Integer> queue2=new PriorityQueue<>();
for(int i=0;i<nums.length/2;i++){
queue1.add(nums[i]);
}
for(int i=nums.length/2;i<nums.length;i++){
if(nums[i]>queue1.peek()){
queue2.add(queue1.poll());
queue1.add(nums[i]);
}
else{
queue2.add(nums[i]);
}
}
//从最右边开始放数字
int position=nums.length-1;
while(position>0){
//数组长度为偶数,先放大的
if(nums.length%2==0){
nums[position--]=queue1.poll();
nums[position--]=queue2.poll();
}
//数组长度为奇数,先放小的
else{
nums[position--]=queue2.poll();
nums[position--]=queue1.poll();
}
}
//position最后为0,这个位置不论nums长度为奇还是偶都是放最小的
if(position==0){
nums[0]=queue2.poll();
}
}
}
原题地址:
324. 摆动排序 II