LeetCode #324 Wiggle Sort II

来源:互联网 发布:淘宝一元秒杀怎么付款 编辑:程序博客网 时间:2024/06/16 05:02

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];    }};
0 0
原创粉丝点击