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] < ...
随机推荐
- vim 去掉自动注释和自动回车
取消 :set paste 恢复 :set paste!
- Windows live Writer Tips
http://lehsys.blogspot.com/2013/03/windows-live-writer-how-to-change.html http://www.carlosag.net/to ...
- 【转】Linux设置和查看环境变量的方法
转: http://www.jb51.net/LINUXjishu/77524.html 1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量 ...
- IPC之msgutil.c源码解读
// SPDX-License-Identifier: GPL-2.0-or-later /* * linux/ipc/msgutil.c * Copyright (C) 1999, 2004 Man ...
- mmu(虚拟地址和物理地址简单图解)
- python函数:函数使用原则、定义与调用形式
一.函数初始 二.函数的使用原则 三.函数的定义与调用形式 四.函数的返回值 五.函数参数的使用 一.函数初始 # 须知一: # 硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容 # 内存 ...
- JS批量绑定事件
,,,,] for(var j in a){ $("#" + j).click(function () { // 前提是先动态生成id是j的标签 var id_cm = $(thi ...
- kotlin面向对象入门
之前在学kotlin基础语法时咱们是采用三方jar包在eclipse工程下进行的,很显然这工具在实际商用中基本上很少用到了,最终是要编写android程序,所以说从这里起得更换一个更加智能更加贴近实际 ...
- js 深浅拷贝 笔记总结
一.js 数据类型 javaScritp的数据类型有:数值类型.字符串类型.布尔类型.null.undefined.对象(数组.正则表达式.日期.函数),大致分成两种:基本数据类型和引用数据类型, 其 ...
- CodeForces - 1204E Natasha, Sasha and the Prefix Sums (组合数学,卡特兰数扩展)
题意:求n个1,m个-1组成的所有序列中,最大前缀之和. 首先引出这样一个问题:使用n个左括号和m个右括号,组成的合法的括号匹配(每个右括号都有对应的左括号和它匹配)的数目是多少? 1.当n=m时,显 ...