力扣刷题第三天:324. 摆动排序 II

方法一:倒序

根据题意我们可以先将数据从小到大排序,例如排完序是[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],两个相同的元素会相邻。这种情况只有在相等元素个数达到\frac{(n+1)}{2}时才会发生。那么这里解决的办法就是将相同的元素分开,将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方法将中间值放到中间,然后中间值前边的元素都比它小,后边的元素都比它大;然后再按照方法一的顺序交替穿插即可。

未完待续……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值