Problem Description
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]….
Example:
(1) Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6].
(2) Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2].
Note:
You may assume all input has valid answer.
Follow Up:
Can you do it in O(n) time and/or in-place with O(1) extra space?
思路
排序之后再倒序,然后大数字排奇数位,小数字排偶数位。。酱是O(nlgn)的。。。
O(n)的方法可能是先利用快排的思想找到中位数,然后通过中位数进行排列。。
Code
package Q324;
import java.util.Arrays;
import java.util.Collections;
public class Solution {
// //Find the Kth smaller number
// public static int getK_MinNum(int[]nums,int p,int nowp,int right,int left){
// nowp=right;
// int tmp=nums[right];
// int [] newnums=new int[nums.length];
// int l=right;int h=left;
// for(int i=right+1;i<=left;i++){
// if(nums[i]<tmp){
// newnums[l++]=nums[i];
// nowp++;
// }
// else{
// newnums[h--]=nums[i];
// }
// }
// newnums[l]=tmp;
// if(nowp==p) return tmp;
// else if(nowp<p) return getK_MinNum(newnums,p,nowp,h+1,left);
// else return getK_MinNum(newnums,p, nowp,right,l-1);
//
// }
public static void wiggleSort(int[] nums) {
int len=nums.length;
int [] newnums= new int[len];
int i,j,tmp;
Arrays.sort(nums);
for(i=0;i<(len-1)/2+1;i++){
tmp=nums[i];
nums[i]=nums[len-1-i];
nums[len-1-i]=tmp;
}
i=0;
while(2*i+1<len){
newnums[2*i+1]=nums[i];
i++;
}
j=i;
while(j<len&&2*(j-i)<len){
newnums[2*(j-i)]=nums[j];
j++;
}
for(i=0;i<nums.length;i++) nums[i]=newnums[i];
}
// public static void main(String[] args) {
// int [] nums={1,2,3,4,5,6,7};
// wiggleSort(nums);
// for(int i=0;i<nums.length;i++) System.out.print(nums[i]+" ");
//
//
//
// }
}