leetcode-324
题面:
原题:https://leetcode-cn.com/problems/wiggle-sort-ii/submissions/
思路:
- 排序
- 取出前半段的最后一个数,再取出后半段的最后一个数
- 取出前半段的倒数第二个数,再取出后半段的倒数第二个数
- 以此类推
重点:
-
分段时,数组长度为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
-
为什么不能是取出前半段的第一个数,再取出后半段的第一个数?
这种做法
可以保证:
第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];
}
}
}
};