324. Wiggle Sort II
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?
class Solution {
public:
void wiggleSort(vector<int>& nums)
{
if (nums.size() <= 1) return;
sort(nums.begin(), nums.end());
int len = nums.size(), k = 1, high = (len % 2) ? len - 1 : len - 2, mid = nums[len / 2];
vector<int> ans(len, mid);
for(int i = len-1; i >= 0 && nums[i] > mid; i--, k += 2)
ans[k] = nums[i];
for(int i = 0; i < len && nums[i] < mid; i++, high -= 2)
ans[high] = nums[i];
nums = ans;
}
};
网上的大神用的方法!牛的一逼!
class Solution {
public:
void wiggleSort(vector<int>& nums) {
nth_element(nums.begin(), nums.begin()+nums.size()/2, nums.end());
int len=nums.size(), low=0, high=len-1, mid =nums[len/2], i=0;
auto index = [=](int pos){ return (1 + pos * 2) % (len | 1); };
while(i <= high)
{
if(nums[index(i)] > mid) swap(nums[index(i++)], nums[index(low++)]);
else if(nums[index(i)]<mid) swap(nums[index(i)],nums[index(high--)]);
else i++;
}
}
};