给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。
示例 1:
输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]
示例 2:
输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]
说明:
你可以假设所有输入都会得到有效的结果。
进阶:
你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?
思路:
1. 先把数组的中间放上中位数. nth_element函数,STL
2. 然后荷兰三色问题,并且两边不需要排序
3. 穿插排序
class Solution {
public:
void wiggleSort(vector<int>& nums) {
nth_element(nums.begin(), nums.begin()+nums.size()/2, nums.end());
//荷兰三色国旗的问题
int l=0, r= nums.size()-1;
int i=0, pivot= *(nums.begin()+nums.size()/2);
while(i<=r)
{
if(nums[i]<pivot)
{
swap(nums[i],nums[l]);
i++;
l++;
}
else if(nums[i]==pivot)
{
i++;
}
else
{
swap(nums[i],nums[r]);
r--;
}
}
vector<int> tmp;
int pos1=(nums.size()%2==0)?nums.size()/2-1:nums.size()/2;
int pos2=nums.size()-1;
for(int i=0; i<nums.size();i++)
{
if(i%2==0)
{
tmp.push_back(nums[pos1--]);
}
else{
tmp.push_back(nums[pos2--]);
}
}
std::copy(tmp.begin(),tmp.end(),nums.begin());
}
};