[leetcode] 324. Wiggle Sort II 解题报告

题目链接: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++;
        }
    }
};

参考:https://leetcode.com/discuss/77133/o-n-o-1-after-median-virtual-indexing

你可能感兴趣的:(LeetCode,array,sort)