Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]…
Example 1:
Input: nums = [1, 5, 1, 1, 6, 4]
Output: One possible answer is [1, 4, 1, 5, 1, 6].
Example 2:
Input: nums = [1, 3, 2, 2, 3, 1]
Output: 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?
这道题,我开始就想,很简单啊,先把nums排序,小的数放在偶数位,大的数放在奇数位,这样就ok了。
class Solution {
public void wiggleSort(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
int[] arr = new int[n];
int j = 0;
int count = 0;
for(int i = 0; j < n ; i++) { //先把最小的几个数放在奇数位上
arr[j] = nums[i];
j += 2;
count++;
}
for(int i = 1 ; count < n ; i += 2) { //把剩下排好序的大数放在剩下的偶数位上
arr[i] = nums[count];
count++;
}
for(int i = 0 ; i < n ; i++) {
nums[i] = arr[i];
}
}
}
但是,我提交后,发现自己错了,Wrong Answer
错误的案例是:[4,5,5,6]
这时候,我才发现了自己没有考虑重叠元素。看了discuss,有个人总结的很多,但是我就是看不懂啊,后来在百度搜了搜,发现了一个人的答案,他的思路和我之前的一样,但是我运行他的答案,竟然对了!
仔细一看,发现了我与人家的区别,他是采用倒叙的方式,先把大的数放在奇数位,然后把小的数放在偶数位,(而我是先把小的数放在偶数位,在把大的数放在奇数位),不过我感觉这位应该对的也是凑巧,因为他说也可以先放小的,但是我先放小的就错了。。。
正确的答案:
class Solution {
public void wiggleSort(int[] nums) {
Arrays.sort(nums);
int[] arr = new int[nums.length];
int i = 1,j=0,k=nums.length-1;
while(i<arr.length){
arr[i]=nums[k--];
i+=2;
}
while(j<arr.length){
arr[j] = nums[k--];
j+=2;
}
for(int x=0;x<nums.length;x++){
nums[x] = arr[x];
}
}
}
答案来自:324. Wiggle Sort II