leetcode 280.Wiggle Sort 、324. Wiggle Sort II

Wiggle Sort:

      注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求。

      解法一错误版本:

      如果nums的长度是4,这种情况下nums[i+1]会越界。但是如果你用的是i和i-1的组合,一定可以不会越界,因为i不越界i-1就一定不会越界,for循环控制i,i越界了整个循环就结束了。

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        for(int i = 1;i < nums.size();i += 2){
            swap(nums[i],nums[i+1]);
        }
        return;
    }
};

     解法一正确版本:

     如果没有if这个语句,当nums.size() <= 2时,for循环里的nums[i]会出现数组越界

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        if(nums.size() <= 2)
            return;
        for(int i = 2;i < nums.size();i += 2)
            swap(nums[i],nums[i-1]);
        return;        
    }
};

       解法二

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        if(nums.size() <= 1)
            return;
        for(int i = 1;i < nums.size();i++){
            if((i % 2 == 1 && nums[i] < nums[i-1]) || (i % 2 == 0 && nums[i] > nums[i-1]))
                swap(nums[i],nums[i-1]);
        }
        return;
    }
};

https://www.cnblogs.com/grandyang/p/5177285.html

Wiggle Sort II

与1不同,这个不能为等号。排序后,两个指针,一个从中间往前,一个从末尾往前。j、k的初始化这注意,必须保证0~j比j+1~k大于等于1个,这样才能填满

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        vector<int> tmp = nums;
        sort(tmp.begin(),tmp.end());
        int j = (nums.size() - 1)/2,k = nums.size() - 1;
        for(int i = 0;i < nums.size();i++){
            nums[i] = i % 2 ? tmp[k--] : tmp[j--];
        }
        return;
    }
};

http://www.cnblogs.com/grandyang/p/5139057.html

猜你喜欢

转载自www.cnblogs.com/ymjyqsx/p/9862099.html
今日推荐