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
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];
}
};