题目链接:https://leetcode.com/problems/wiggle-sort-ii/#/description
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]
.
思路:
Sort and then write the smaller half of the numbers on the even indexes and the larger half of the numbers on the odd indexes, both from the back. Example:
Small half: 4 . 3 . 2 . 1 . 0 .
Large half: . 9 . 8 . 7 . 6 . 5
----------------------------------
Together: 4 9 3 8 2 7 1 6 0 5
So write nums
from the back, interweaving sorted[0..4]
(indexed by j
) and sorted[5..9]
(indexed by k
).
class Solution{
public:
void wiggleSort(vector<int>& nums)
{
vector<int>sorted_num(nums);
sort(sorted_num.begin(),sorted_num.end());
for(int i=nums.size()-1,j=0,k=i/2+1;i>=0;i--)
{
nums[i]=sorted_num[i&1?k++:j++];
}
}
};