1. 首先考虑排序后交替插入

  首尾交替插入,这种方法对于有重复数字的数组不可行;

  1. class Solution {
  2. public:
  3. void wiggleSort(vector<int>& nums) {
  4. //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
  5. //错误,没有考虑重复答案存在情况;
  6. sort(nums.begin(),nums.end());
  7. int i=;
  8. int j=nums.size()-;
  9. vector<int> res;
  10. while(i<=j){
  11. if(i<=j)
  12. res.push_back(nums[i++]);
  13. if(i<=j)
  14. res.push_back(nums[j--]);
  15. }
  16. for(int i=;i<nums.size();i++){
  17. nums[i]=res[i];
  18. }
  19. }
  20. };

对此进行改进:

  1. class Solution {
  2. public:
  3. void wiggleSort(vector<int>& nums) {
  4. //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
  5.  
  6. //改进,将前后两个数组反序如1 2 3 4 5 6 分为 【3 2 1】,【6 5 4】然后按顺序插入;
  7. sort(nums.begin(),nums.end());
  8.  
  9. vector<int> res;
  10. int mid=(nums.size()+)/;
  11. int i=mid-;int j=nums.size()-;
  12. while(i>=){
  13. if(i>=) res.push_back(nums[i--]);
  14. if(j>=mid) res.push_back(nums[j--]);
  15. }
  16. for(int i=;i<nums.size();i++){
  17. nums[i]=res[i];
  18. }
  19. }
  20. };

采用快排:

  1. class Solution {
  2. public:
  3. int partition(vector<int>& nums,int l,int r){
  4. int pivot=nums[l];
  5. while(l<r){
  6. while(l<r && nums[r]>=pivot)
  7. r--;
  8. nums[l]=nums[r];
  9. while(l<r && nums[l]<=pivot)
  10. l++;
  11. nums[r]=nums[l];
  12. }
  13. nums[l]=pivot;
  14. return l;
  15. }
  16. void quicksort(vector<int>& nums,int start,int end){
  17. if(start>=end) return;
  18. int pivot=partition(nums,start,end);
  19. quicksort(nums,start,pivot-);
  20. quicksort(nums,pivot+,end);
  21. }
  22. void wiggleSort(vector<int>& nums) {
  23. //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
  24. quicksort(nums,,nums.size()-);
  25. vector<int> res;
  26. int mid=(nums.size()+)/;
  27. int i=mid-;int j=nums.size()-;
  28. while(i>=){
  29. if(i>=) res.push_back(nums[i--]);
  30. if(j>=mid) res.push_back(nums[j--]);
  31. }
  32. for(int i=;i<nums.size();i++){
  33. nums[i]=res[i];
  34. }
  35. }
  36. };

以上方法的时间复杂度为O(nlogn) 空间复杂度为O(n)

  2. 还有时间复杂度为O(n)的原地方法:

空间复杂度为O(1),

leetcode324 摆动排序II的更多相关文章

  1. [Swift]LeetCode324. 摆动排序 II | Wiggle Sort II

    Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...

  2. Leetcode 324.摆动排序II

    摆动排序II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...

  3. Java实现 LeetCode 324 摆动排序 II

    324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...

  4. [LeetCode] 324. Wiggle Sort II 摆动排序 II

    Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...

  5. 324. 摆动排序 II(三路划分算法)

    题目: 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [ ...

  6. LeetCode——324. 摆动排序 II

    给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [1, 5 ...

  7. [Leetcode] 第324题 摆动排序II

    一.题目描述 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...

  8. 324 Wiggle Sort II 摆动排序 II

    给定一个无序的数组nums,将它重新排列成nums[0] < nums[1] > nums[2] < nums[3]...的顺序.例子:(1) 给定nums = [1, 5, 1, ...

  9. [LeetCode] 280. Wiggle Sort 摆动排序

    Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...

随机推荐

  1. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  2. Windows live Writer Tips

    http://lehsys.blogspot.com/2013/03/windows-live-writer-how-to-change.html http://www.carlosag.net/to ...

  3. MySQL单表查询实例

    数据表准备 ​```mysql create table emp( id int not null unique auto_increment, name varchar(20) not null, ...

  4. [微信小程序]聊天对话(文本,图片)的功能(完整代码附效果图)

    废话不多说, 先上图: <!--pages/index/to_news/to_news.wxml--> <view class='tab'> <view class='l ...

  5. [CEOI1999]Sightseeing trip(Floyed)

    [CEOI1999]Sightseeing trip Description There is a travel agency in Adelton town on Zanzibar island. ...

  6. Python 学习第一天(二)python 入门

    1.第一个python程序 1.1 直接打印输出 打开cmd,输入python进入到python交互式环境:(看到>>>是在Python交互式环境下:) 在python交互环境下输入 ...

  7. 【u-boot】u-boot中initf_dm()函数执行流程(转)

    前部分设备模型初始化 为了便于阅读,删掉部分代码,只留关键的过程: static int initf_dm(void){    int ret;    ret = dm_init_and_scan(t ...

  8. AIDE入侵检测系统

    一.AIDE简介 • AIDE(Advanced Intrusion Detection Environment)• 高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那 ...

  9. 【洛谷P4172】水管局长

    题目大意:给定 N 个点,M 条边的无向图,支持两种操作:动态删边和查询任意两点之间路径上边权的最大值最小是多少. 题解: 引理:对原图求最小生成树,可以保证任意两点之间的路径上边权的最大值取得最小值 ...

  10. printf格式输出

    参考:http://www.cplusplus.com/reference/cstdio/printf/ C string that contains the text to be written t ...