LeetCode #324 Wiggle Sort II

Problem Description

  • Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]….
  • Example:
  • (1) Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6].
  • (2) Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2].
  • Note:
  • You may assume all input has valid answer.
  • Follow Up:
  • Can you do it in O(n) time and/or in-place with O(1) extra space?

Some Details

  • 巧法解题

Solution

    这是一道细节要思考清楚的难ac题目,有令人沮丧的O(n)O(1)做法(姿势不对速度远比nlgn慢)。
    当时切题花了数小时,但其糟糕的结果让我直接放弃了书写该题题解。
    现如今近两个月过去细节不清,先放于此。
    于寒假会重新切此题,因为我尚且不明白自己的O(n)做法问题出在哪里。

Code

//这是一个较为显然的nlgn做法
class Solution {
public:
    vector<int>nums;
    void qsort(int l,int r)
    {
        int i,j,t,mid;
        i=l; j=r; mid=nums[(l+r)/2];
        while (i<=j)
        {
            while (i<r && nums[i]>mid) i++;
            while (l<j && nums[j]<mid) j--;
            if (i<=j)
            {
                t=nums[i]; nums[i]=nums[j]; nums[j]=t;
                i++; j--;
            }
        }
        if (i<r) qsort(i,r); if (l<j) qsort(l,j);
    }
    void wiggleSort(vector<int>& num) 
    {
        int i,n,mid;
        n=num.size(); nums=num; mid=(n+1)/2-1;
        qsort(0,n-1);
        i=mid-1; while (i>=0 && nums[i]==nums[mid]) i--;
        for (int j=0;j<i;j++)  if (nums[j]==nums[mid]) swap(nums[j],nums[i--]);
        i=mid+1; while (i<n  && nums[i]==nums[mid]) i++;
        for (int j=n-1;j>i;j--)if (nums[j]==nums[mid]) swap(nums[j],nums[i++]);
        vector<int> a=nums;
        for (i=0;i<n;i++)
        {
            if (i % 2==0) a[i]=nums[(i+(n|1)-1)/2];
            else        a[i]=nums[(i-1)/2]; 
        }
        for (i=0;i<n;i++) num[i]=a[i];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值