324. Wiggle Sort II

来源:互联网 发布:体检软件哪个好 编辑:程序博客网 时间:2024/05/21 21:34

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?
Analysis:
看了discuss里的程序,即使表达同样的思想也比自己写的简练太多了。
代码中有详细注释。
Source Code(C++):

#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution {public:    void wiggleSort(vector<int>& nums) {        nth_element(nums.begin(), nums.begin()+nums.size()/2, nums.end());        int median=nums.at(nums.size()/2); //取得中位数#define A(i) nums[(1+2*i)%(nums.size()|1)]  //此行的问题//偶数时对应关系:A[0]->nums[1],A[1]->nums[3],A[2]->nums[5],A[3]->nums[7],A[4]->nums[9],//A[5]->nums[0],A[6]->nums[2],A[7]->nums[4],A[8]->nums[6],A[9]->nums[8]//奇数时对应关系:A[0]->nums[1],A[1]->nums[3],A[2]->nums[5],A[3]->nums[7],//A[4]->nums[0],A[5]->nums[2],A[6]->nums[4],A[7]->nums[6],A[8]->nums[8]        int head=0, tail=nums.size()-1;        int k=0;        while(k<=tail) {            if (A(k)>median) {                swap(A(head++), A(k++)); //大数放头            }            else if (A(k)<median) {    //小数放尾                swap(A(tail--), A(k));            }            else {                k++;  //等于median的数放在中间以确保不会出现nums[i]!=nums[i+1];            }        }    }};int main() {    Solution sol;    vector<int> v;    v.push_back(1);v.push_back(1);v.push_back(1);v.push_back(1);v.push_back(2);v.push_back(2);v.push_back(2);    sol.wiggleSort(v);    for (vector<int>::iterator i=v.begin(); i!=v.end(); i++) {        cout << *i << ' ';    }    return 0;}
0 0
原创粉丝点击