Given an unsorted array nums
, reorder it in-place such that nums[0] <= nums[1] >= nums[2] <= nums[3]...
.
For example, given nums = [3, 5, 2, 1, 6, 4]
, one possible answer is [1, 6, 2, 5, 3, 4]
.
思路:这题主要在观察规律,并且证明算法的可行性。
nums[0]<=nums[1]>=nums[2]<=nums[3>=nums[4]
nums[i-2]<=nums[i-1] >= nums[i]
如果index为偶数,nums应该在左右中间。
如果index为奇数,应该比两边的大。
假设,0~i-1,已经wiggit好了,加入i,那么存在两种情况:
1. i%2==0,加进去的数,index为偶数, 则前面一个数是波峰。
if nums[i-1]>=nums[i] , nothing to do.
if nums[i-1]<=nums[i], 因为nums[i-2]<=nums[i-1], swap (nums[i-1] nums[i]), 则nums[i-2]<=nums[i]>=nums[i-1],满足条件。
2. i%2!=0, 加进去的数,index为奇数,则前面一个数是波谷。
if nums[i-1]<=nums[i], nothing to do.
if nums[i-1]>=nums[i], 因为nums[i-2]>=nums[i-1], swap (nums[i-1], nums[i]), 则 nums[i-2]>=nums[i]<=nums[i-1],满足条件。
所以,这样子swap可以保证整个array是波浪形的。
class Solution {
public void wiggleSort(int[] nums) {
if(nums == null || nums.length == 0) {
return;
}
for(int i = 1; i < nums.length; i++) {
if(i % 2 == 0) {
// even, wave bottom;
if(nums[i - 1] <= nums[i]) {
swap(nums, i - 1, i);
}
} else {
// odd, wave peek;
if(nums[i - 1] >= nums[i]) {
swap(nums, i - 1, i);
}
}
}
}
private void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}