方法一:倒序
根据题意我们可以先将数据从小到大排序,例如排完序是[1,2,3,4,5,6],可以将相邻的两个元素互换位置[1,3,2,5,4,6],就得到了结果。但是考虑到还有相同元素的情况,这种方法不可行。
根据题意如果想得到摆动排序那么相等的元素不能超过,n是数组长度。那么就可以先从小到大排序,然后在数组 处将数组分为前后两部分,将前边部分称作A,后面部分为B。如果是奇数那么将中间的元素归为A。然后可以A、B交替穿插排列即可。此时还有一个特例,形如[1,5,5,6]这种情况,如果按这种方法的话结果是[1,5,5,6],两个相同的元素会相邻。这种情况只有在相等元素个数达到时才会发生。那么这里解决的办法就是将相同的元素分开,将A、B两部分分别倒置,如[1,5,5,6],A部分为[1,5],倒置之后是[5,1];B部分是[5,6]倒置之后是[6,5]。那么穿插之后是[5,6,1,5]。
class Solution {
public:
void wiggleSort(vector<int>& nums) {
vector<int> ans;
ans = nums;
sort(ans.begin(), ans.end());
int x = (nums.size() + 1) / 2;
nums[0] = ans[0];
for(int i = 0, j = x - 1, n = ans.size() - 1; i < ans.size(); i ++){
if(i % 2)
nums[i] = ans[n --];
else
nums[i] = ans[j --];
}
}
};
方法二找中间值法。
其实从方法一我们可以看出来,并不需要完全将数组进行排序,只要将数组均匀分为A、B两部分,这里B部分的元素都大于A部分即可,不需要关心他们内部的顺序。因此可以使用STL中的nth_element方法将中间值放到中间,然后中间值前边的元素都比它小,后边的元素都比它大;然后再按照方法一的顺序交替穿插即可。
未完待续……