[Locked] Wiggle Sort

Wiggle Sort

Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] <= nums[3]....

For example, given nums = [3, 5, 2, 1, 6, 4], one possible answer is [1, 6, 2, 5, 3, 4].

分析:

  序列单调性问题,本题要求在不开额外数组的情况下使得序列呈现增减增减的规律

解法:

  遍历数组相邻对,遇到不符合要求的,调换位置

证明:

  充分性,数学归纳法,之前的序列满足题目要求,当第k个对呈x规律,若第k+1个对呈y规律,满足要求;若第k+1个对呈x规律,调换位置,则呈y规律,满足要求;

  必要性,因为题目只要求给出一个可行解,所以无需具备必要性。

代码:

void wiggleSort(vector<int> &a) {
    bool inc = true;
    for(int i = 0; i < a.size() - 1; i++) {
        if((a[i + 1] < a[i] && inc) || (a[i + 1] > a[i] && !inc))
            swap(a[i], a[i + 1]);
        inc = !inc;
    }
    return;
}

 

原文地址:https://www.cnblogs.com/littletail/p/5197895.html