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

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

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

对此进行改进:

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

采用快排:

class Solution {
public:
int partition(vector<int>& nums,int l,int r){
int pivot=nums[l];
while(l<r){
while(l<r && nums[r]>=pivot)
r--;
nums[l]=nums[r];
while(l<r && nums[l]<=pivot)
l++;
nums[r]=nums[l];
}
nums[l]=pivot;
return l;
}
void quicksort(vector<int>& nums,int start,int end){
if(start>=end) return;
int pivot=partition(nums,start,end);
quicksort(nums,start,pivot-);
quicksort(nums,pivot+,end);
}
void wiggleSort(vector<int>& nums) {
//因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
quicksort(nums,,nums.size()-);
vector<int> res;
int mid=(nums.size()+)/;
int i=mid-;int j=nums.size()-;
while(i>=){
if(i>=) res.push_back(nums[i--]);
if(j>=mid) res.push_back(nums[j--]);
}
for(int i=;i<nums.size();i++){
nums[i]=res[i];
}
}
};

以上方法的时间复杂度为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. vim 去掉自动注释和自动回车

    取消 :set paste 恢复 :set paste!

  2. Windows live Writer Tips

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

  3. 【转】Linux设置和查看环境变量的方法

    转: http://www.jb51.net/LINUXjishu/77524.html 1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量 ...

  4. IPC之msgutil.c源码解读

    // SPDX-License-Identifier: GPL-2.0-or-later /* * linux/ipc/msgutil.c * Copyright (C) 1999, 2004 Man ...

  5. mmu(虚拟地址和物理地址简单图解)

  6. python函数:函数使用原则、定义与调用形式

    一.函数初始 二.函数的使用原则 三.函数的定义与调用形式 四.函数的返回值 五.函数参数的使用 一.函数初始 # 须知一: # 硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容 # 内存 ...

  7. JS批量绑定事件

    ,,,,] for(var j in a){ $("#" + j).click(function () { // 前提是先动态生成id是j的标签 var id_cm = $(thi ...

  8. kotlin面向对象入门

    之前在学kotlin基础语法时咱们是采用三方jar包在eclipse工程下进行的,很显然这工具在实际商用中基本上很少用到了,最终是要编写android程序,所以说从这里起得更换一个更加智能更加贴近实际 ...

  9. js 深浅拷贝 笔记总结

    一.js 数据类型 javaScritp的数据类型有:数值类型.字符串类型.布尔类型.null.undefined.对象(数组.正则表达式.日期.函数),大致分成两种:基本数据类型和引用数据类型, 其 ...

  10. CodeForces - 1204E Natasha, Sasha and the Prefix Sums (组合数学,卡特兰数扩展)

    题意:求n个1,m个-1组成的所有序列中,最大前缀之和. 首先引出这样一个问题:使用n个左括号和m个右括号,组成的合法的括号匹配(每个右括号都有对应的左括号和它匹配)的数目是多少? 1.当n=m时,显 ...