LintCode 508: Wiggle Sort
LintCode 508: Wiggle Sort
题目描述
给你一个没有排序的数组,请将原数组就地重新排列满足如下性质
nums[0] <= nums[1] >= nums[2] <= nums[3]....
Thu Feb 23 2017
思路
这道题看起来好像无从下手,但其实思路很简单,方法也有很多种。
第一种方法
先将数组排序,然后将第二个、第三个数交换,第四个、第五个数交换...即可。时间复杂度是\(O(nlogn)\).
第二种方法
第二种方法先找出数字们的中位数,然后将大于中位数的数放在奇数位上,小于中位数的数放在偶数位上。
求中位数算法的时间复杂度可以做到\(O(n)\),即利用快排的思想,对于每一次划分出来的partition,下一次只递归中位数所在的那一半数组。虽然在最坏情况下时间复杂度是\(O(n^2)\),但是平均情况是\(O(n)\).
找到中位数后,由于题目要求只能在原数组上原地排序,不能借用新数组,所以应该还是要利用快排的思想,在数组中分别找到在奇数位但比中位数小的数,以及在偶数位但比中位数大的数,然后两者交换。这个方法在存在很多与中位数相等的数的时候不太好用,待使用更好的解决方案。
第三种方法
上面想了那么多,最后发现原来题目还可以更简单一点。
其实只需要从第1个数开始向后遍历,每次检查当前数与前一个数是否满足大小关系:在奇数位的数要大于偶数位的数。
代码
// 只放第三种方法
void wiggleSort(vector<int>& nums)
{
for(int i = 1; i < nums.size(); ++i)
if((i % 2 == 1 && nums[i] < nums[i - 1])
|| (i % 2 == 0 && nums[i] > nums[i - 1]))
swap(nums[i - 1], nums[i]);
}
LintCode 508: Wiggle Sort的更多相关文章
- lintcode:Wiggle Sort II
Wiggle Sort II Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] ...
- lintcode:Wiggle Sort
Wiggle Sort Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= ...
- [LintCode] Wiggle Sort II 扭动排序之二
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- [LintCode] Wiggle Sort 扭动排序
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- [LeetCode] Wiggle Sort II 摆动排序
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- [LeetCode] Wiggle Sort 摆动排序
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- Leetcode 280. Wiggle Sort
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- [Locked] Wiggle Sort
Wiggle Sort Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= ...
- LeetCode 280. Wiggle Sort (摆动排序)$
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
随机推荐
- OC创建对象并访问成员变量
1.创建一个对象 Car *car =[Car new] 只要用new操作符定义的实体,就会在堆内存中开辟一个新空间 [Car new]在内存中 干了三件事 1)在堆中开辟一段存储空间 2)初始化成员 ...
- Java final用法
//继承弊端:打破了封装性. /* final关键字: 1,final是一个修饰符,可以修饰类,方法,变量. 2,final修饰的类不可以被继承. 3,final修饰的方法不可以被覆盖. 4,fina ...
- 使用docker国内镜像解决方案
1:蜂巢镜像 https://c.163yun.com/hub#/m/library/ 例如: docker pull hub.c.163.com/library/nginx:1.8 再次执行dock ...
- CA如何吊销签署过的证书
1: 客户端获取要吊销证书的serial(在使用证书上的主机执行) openssl x509 -in httpd.crt -noout -serial -subject 2:拿到证书的编号后,通过 ...
- Q3 大型科技公司季报
1. alphabet Alphabet(谷歌母公司)今天发布了截至9月30日的2018财年第三季度财报.报告显示,Alphabet第三季度总营收为337.40亿美元,比上年同期的277.72亿美元增 ...
- php PDO操作类
<?php /*//pdo连接信息 $pdo=array("mysql:host=localhost;dbname=demo;charset=utf8","root ...
- app耗电量测试工具--PowerTutor
PowerTutor是一款用来测试手机功耗的小工具,它可以只管地展示手机系统主要的组件和各种用户app产生的功耗数据.它可以统计app的屏幕功耗(LCD).CPU功耗以及WiFi和3G网络功耗,我们可 ...
- jQuery数据表格控件boostrap-table
表格初始化js代码 function TableInit() { $("#edit").attr({"disabled":"disabled" ...
- asp.net 中使用 pagedlist 分页并具有查询功能的实现方法
用pagedlist在项目中做分页已N次了,今天再次用实例来实现一个带查询功能的分页例子. 1.在view代码: @using PagedList.Mvc@model BGZS.Models.User ...
- 【Python】第一篇:python基础_1
本篇内容 Python介绍 安装 第一个程序(hello,world) 变量 用户输入(input) 数据类型 数据运算 if判断 break和continue的区别 while 循环 一. Pyth ...