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]
.
For the given example, it can be easily done with sorting. Thus, the first thinking is I can do this with sorting and combine the first half and second half. This will gives O(nlog(n)) time complexity.
But this problem requires in place and one pass, so new algorithm is necessary. Actually, we don't need nums[0]<nums[2]. Thus, we just need to adjust the adjacent elements. Just need to guarantee the adjacent elements have the corresponding sequence. And notice that odd one comparison is less and even one is larger. One flag is used to deal with this.
void wiggleSort(vector<int>& nums) {
int flag=1;
int len = nums.size();
if(!len) return;
for(int i=1; i<len; i++)
{
if(nums[i]*flag<nums[i-1]*flag)
{
int temp=nums[i];
nums[i] = nums[i-1];
nums[i-1] = temp;
}
flag=-1*flag;
}
}