题目链接:https://leetcode.com/problems/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) { int n = nums.size(); auto mid = nums.begin()+n/2; nth_element(nums.begin(), mid, nums.end()); int midVal = *mid, high= n-1, low = 0, i = 0; auto index = [=](int pos){ return (1+2*pos)%(n|1); }; while(i <= high) { if(nums[index(i)] > midVal) swap(nums[index(i++)], nums[index(low++)]); else if(nums[index(i)] < midVal) swap(nums[index(i)], nums[index(high--)]); else i++; } } };