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