leetcode324 摆动排序II

这种方法对于有重复数字的数组不可行;

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
        //错误,没有考虑重复答案存在情况;
        sort(nums.begin(),nums.end());
        int i=0;
        int j=nums.size()-1;
        vector<int> res;
        while(i<=j){
            if(i<=j)
                res.push_back(nums[i++]);
            if(i<=j)
                res.push_back(nums[j--]);
        }
        for(int i=0;i<nums.size();i++){
            nums[i]=res[i];
        }
    }
};

 对此进行改进:

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;

        //改进,将前后两个数组反序如1 2 3 4 5 6 分为 【3 2 1】,【6 5 4】然后按顺序插入;
        sort(nums.begin(),nums.end());

        vector<int> res;
        int mid=(nums.size()+1)/2;
        int i=mid-1;int j=nums.size()-1;
        while(i>=0){
            if(i>=0) res.push_back(nums[i--]);
            if(j>=mid) res.push_back(nums[j--]);
        }
        for(int i=0;i<nums.size();i++){
            nums[i]=res[i];
        }
    }
};

class Solution {
public:
     void wiggleSort(vector< int>& nums) {
         //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;

         //改进,将前后两个数组反序如1 2 3 4 5 6 分为 【3 2 1】,【6 5 4】然后按顺序插入;
        sort(nums.begin(),nums.end());

        vector< int> res;
         int mid=(nums.size()+ 1)/ 2;
         int i=mid- 1; int j=nums.size()- 1;
         while(i>= 0){
             if(i>= 0) res.push_back(nums[i--]);
             if(j>=mid) res.push_back(nums[j--]);
        }
         for( int i= 0;i<nums.size();i++){
            nums[i]=res[i];
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/joelwang/p/11969650.html