leetcode-324

题面

image-20201122204902512

原题https://leetcode-cn.com/problems/wiggle-sort-ii/submissions/

思路:

  1. 排序
  2. 取出前半段的最后一个数,再取出后半段的最后一个
  3. 取出前半段的倒数第二个数,再取出后半段的倒数第二个
  4. 以此类推

重点:

  1. 分段时,数组长度为n,中位下标为mid,必须使用mid = (n+1)/2,它能保证:

    • n为偶数时,mid(n)/2结果相同
    • n为奇数时,mid等于(n)/2的结果加1
    • n为奇数时,遍历下标,偶数下标=奇数下标+1,如果mid(n)/2,那么遍历前半段时,会出现下标为-1的情况。所以mid需要为(n)/2+1
  2. 为什么不能是取出前半段的第一个数,再取出后半段的第一个数?

    这种做法

    可以保证:

    第1个数<第2个数

    但无法保证

    第2个数>第3个数

    例如输入为

代码:

class Solution
{
public:
    void wiggleSort(vector<int>& nums)
    {
        int len=0;
        len = nums.size();
        int a[len];
        int b[len];
        for(int i=0; i<len; i++)
        {
            a[i] = nums[i];
        }
        sort(a,a+len);
//        int mid = (len/2)+1;
//        int mid = len/2;
        int mid = (len+1)/2;
        int tempMid = mid;
        int tempLen = len;
        for(int i=0; i<len; i++){
            if(i%2==0){
                tempMid--;
                nums[i] = a[tempMid];
            }
            else{
                tempLen--;
                nums[i] = a[tempLen];
            }
        }
    }
};

posted on 2021-12-17 20:08  coderabcd  阅读(21)  评论(0编辑  收藏  举报

导航