324. Wiggle Sort II

来源:互联网 发布:手提包女士知乎 编辑:程序博客网 时间:2024/05/22 07:41

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?

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;    }};


0 0
原创粉丝点击