leetcode324 摆动排序II

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的更多相关文章
- [Swift]LeetCode324. 摆动排序 II | Wiggle Sort II
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- Leetcode 324.摆动排序II
摆动排序II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...
- Java实现 LeetCode 324 摆动排序 II
324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...
- [LeetCode] 324. Wiggle Sort II 摆动排序 II
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- 324. 摆动排序 II(三路划分算法)
题目: 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [ ...
- LeetCode——324. 摆动排序 II
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [1, 5 ...
- [Leetcode] 第324题 摆动排序II
一.题目描述 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...
- 324 Wiggle Sort II 摆动排序 II
给定一个无序的数组nums,将它重新排列成nums[0] < nums[1] > nums[2] < nums[3]...的顺序.例子:(1) 给定nums = [1, 5, 1, ...
- [LeetCode] 280. Wiggle Sort 摆动排序
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
随机推荐
- Python单元测试框架unittest重要属性 与 用例编写思路
前言 本文为转载,原文地址作者列举python unittest这个测试框架的主要属性和 测试用例思路 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行, ...
- httpwatch
https://blog.csdn.net/coderising/article/details/89530016 别人的文章
- Linux之top 监视系统任务的工具
top 监视系统任务的工具: 和ps 相比,top是动态监视系统任务的工具,top 输出的结果是连续的: top 命令用法及参数: top 调用方法: top 选择参数 参数: -b 以批量模式运 ...
- 关于 python 一切皆对象的实际理解
1 关于type type 函数可以查看一个对象的类 type 类是一切类型的模版 In [2]: type(1) Out[2]: int In [3]: type(int) Out[3]: type ...
- HTML5的快捷方式
ctrl + / 单行注释 ctrl + shift + / 块注释 ctrl + shift + “+” 展开 ctrl + shift + “-” 折叠 ctrl + alt + L ...
- 微信小程序aes前后端加密解密交互
aes前后端加密解密交互 小程序端 1. 首先引入aes.js /** * [description] CryptoJS v3.1.2 * [description] zhuangzhudada so ...
- java 和 c#返回值方法
java 和 c#都是应用很广泛的语言,也互有优劣. 这两者都是面向对象的语言,在一个方法中如果类型不是void那么是需要return一个返回值的. 但是如果想要返回多个值该怎么办? 排除直接返回一个 ...
- Ubuntu下python开发环境搭建
配置语言 1) 依次点击设置--Region & Language--Manage Installed Languages --install/remove language--chinese ...
- CentOS 7下安装IDL 8.2
材料准备: CentOS 7 x86_64 IDL 8.2,下载自 ftp://ftp.lowell.edu/incoming/temp/old/IDL_Clients/v8.2/idl82sp2li ...
- VUE: 移动端长按弹出确认删除地址(后面测试发现IOS有BUG,后面有更新随笔,更新后的亲测有效)
收货地址的删除方式可能有很多种,我目前见过的暂时只有两种(1.在编辑页删除 2.长按某一条收货地址弹出是否删除地址) 在开发的项目上要求第二种删除方法,于是记录一下我写的代码 ~ 1.首先,在移动端 ...