[LeetCode][C++]摆动排序 II

摆动排序 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) 额外空间来实现吗?


思路:

  1. 看清题目,就是3个数为一组a,b,c。在排序后,中间的比两边的数要大,即 a < b > c a<b > c a<b>c
  2. 复制原数组,并且对其进行排序。
    排序函数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;
}

测试结果:
在这里插入图片描述

  1. 将排序后一半数(较大的数),插入到索引为奇数的位置。排序前一半数字(较小的数),即从中间往前的数,插入到索引为奇数的位置。
  2. 对于中间位置需要计算好。若数组长度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++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值