摆动排序 II
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
示例 1:
输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]
示例 2:
输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]
说明:
你可以假设所有输入都会得到有效的结果。
进阶:
你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?
思路:
- 看清题目,就是3个数为一组a,b,c。在排序后,中间的比两边的数要大,即 a < b > c a<b > c a<b>c。
- 复制原数组,并且对其进行排序。
排序函数sort函数得包含头文件 #include,具体如下
sort(iterator begin, iterator end, method);
//参数:
\quad
begin:起始位置迭代器。
\quad
end:结束位置迭代器。
\quad
method:排序方法,可以省略,默认为less<T>()
,从小到大排序。还可以选择greater<T>()
,后面的括号不能省略,表示从大到小排序,大的在前头,还可以为自定义的比较函数。
注意与priority_queue<int,vector<int>,method>
的区别,此处method可以为less<int>
,greater<int>
,或自定义比较函数。
两者在效果上中,less<T>()= greater<int>
,表示小的在前面。greater<T>() = less<int>
表示大的在前面。
测试如下:
int main() {
vector<int> nums({1,5,1,1,6,3});
//测试大/小顶堆,可以看出此处的less<int>等价于后面的greater<int>(),表示大的数在顶部
priority_queue<int,vector<int>,less<int>> big_q;
priority_queue<int,vector<int>,greater<int>> small_q;
for(auto &e:nums)
{
big_q.push(e);
small_q.push(e);
}
//测试sort
vector<int> tmp=nums;
sort(tmp.begin(),tmp.end(),greater<int>()); //greater<int>()表示大的在前面.
return 0;
}
测试结果:
- 将排序后一半数(较大的数),插入到索引为奇数的位置。排序前一半数字(较小的数),即从中间往前的数,插入到索引为奇数的位置。
- 对于中间位置需要计算好。若数组长度n为偶数,则mid=n/2-1。若n为奇数,则mid=n/2。因为中间位置的数是不需要改变位置的,在插入完成后,处于最后位置。
代码:
//sort函数得包含头文件 #include<algorithm>
class Solution {
public:
void wiggleSort(vector<int>& nums) {
int n=nums.size();
vector<int> tmp=nums;
sort(tmp.begin(),tmp.end());
int mid=n/2,end=n-1;
mid=n%2==0?mid-1:mid;
for(int i=0;i<n;i++)
{
nums[i]=i%2==0?tmp[mid--]:tmp[end--];
}
}
};
结果:
参考链接:
[1] weixin_43750513:Leetcode 324. 摆动排序 II C++