324. Wiggle Sort II

来源:互联网 发布:人工智能龙头概念股 编辑:程序博客网 时间:2024/05/18 05:08

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?

Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.

一开始用了一种很naive的思路:

class Solution {public:    void wiggleSort(vector<int>& nums) {        int size=nums.size();//get the total number        int index=size/2;//divide nums from this position        vector<int> low(size,0);        sort(nums.begin(),nums.end());        for(int i=0,j=0;i<size&&j<index;i+=2,j++){            low[i]=low[i+1]=nums[j];//eg. change [1,1,1] into [1,1,1,1,1,1]        }        if(size%2==0){//even            for(int i=1,j=index;i<size&&j<size;i+=2,j++){                low[i]=nums[j];            }        }        else{//odd            for(int i=1,j=index;i<size&&j<size-1;i+=2,j++){                low[i]=nums[j];            }            low[size-1]=nums[size-1];//the last element        }        nums=low;    }};
这个测试点就不对了:[1,1,2,1,2,2,1],排序后变成[1,1,1,1,2,2,2],前一半[1,1,1]扩展成[1,1,1,1,1,1],然后插值:[1,1,1,2,1,2,2](把后一半间隔插入)

别人的解法:

class Solution {public:    void wiggleSort(vector<int>& nums) {        vector<int> sorted(nums);        sort(sorted.begin(), sorted.end());        for (int i=nums.size()-1, j=0, k=i/2+1; i>=0; i--)            nums[i] = sorted[i&1 ? k++ : j++];    }};
一个trick在于通过i&1来判断位置的奇偶性。这很有意思。

另解:

    void wiggleSort(vector<int>& nums) {        int n = nums.size();        nth_element(nums.begin(), nums.begin() + n/2, nums.end());        int mid = nums[n/2];        auto f = [&](int i) {return (2 * i + 1) % (n | 1);};        int i = 0, j = 0, k = n - 1;        while (j <= k) {            if (nums[f(j)] > mid)                swap(nums[f(i++)], nums[f(j++)]);            else if (nums[f(j)] < mid)                swap(nums[f(j)], nums[f(k--)]);            else                j++;        }     }




原创粉丝点击