Given an unsorted array
nums
, reorder it such thatnums[0] < nums[1] > nums[2] < nums[3]...
.Example:
(1) Givennums = [1, 5, 1, 1, 6, 4]
, one possible answer is[1, 4, 1, 5, 1, 6]
.
(2) Givennums = [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?Small half: M . S . S . S Small half: M . S . S . S . Large half: . L . L . M . Large half: . L . L . L . M -------------------------- -------------------------- Together: M L S L S M S Together: M L S L S L S M
简单来说,先用找到中间的值。 然后再按照上图的方法插空即可。
class Solution {
public:
static bool cmp(int a, int b) {return a>b;}
void wiggleSort(vector<int>& nums) {
auto it = nums.begin() + (nums.size()-1) /2;
nth_element(nums.begin(),it, nums.end());
sort(nums.begin(),it+1, cmp);
sort(it+1, nums.end(), cmp);
vector<int> result;
int left = 0;
int right = (nums.size()-1)/2+1;
for(int i = 0; i < nums.size(); i++)
{
if(i%2==0) result.push_back(nums[left++]);
if(i%2==1) result.push_back(nums[right++]);
}
nums = result;
}
};