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的更多相关文章

  1. lintcode:Wiggle Sort II

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

  2. lintcode:Wiggle Sort

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

  3. [LintCode] Wiggle Sort II 扭动排序之二

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

  4. [LintCode] Wiggle Sort 扭动排序

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

  5. [LeetCode] Wiggle Sort II 摆动排序

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

  6. [LeetCode] Wiggle Sort 摆动排序

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

  7. Leetcode 280. Wiggle Sort

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

  8. [Locked] Wiggle Sort

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

  9. LeetCode 280. Wiggle Sort (摆动排序)$

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

随机推荐

  1. 如何在一台 web 服务器上注册CA证书

    试验环境介绍(CA的主机为192.168.23.10.httpd的主机为:192.168.23.11) 1:新建一台web服务器,主机名为www yum install -y httpd   2:生成 ...

  2. 敏捷冲刺Day7

    一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 第一阶段的测试 全部队员对各个方面进行深入检查,找出细节问题 4. 工作中遇到的困难 工作中的困难:对自己做出来的产品进行否定.以求 ...

  3. jQuery+PHP+Mysql在线拍照和在线浏览照片

    本文用示例讲述了如何使用jQuery与PHP及Mysql结合,实现WEB版在线拍照.上传.显示浏览的功能,ajax交互技术贯穿本文始末,所以本文的读者要求具备相当熟悉jQuery及其插件使用和javs ...

  4. Python2 获取docx/doc文件内容

    整体思路: 下载文件并修改后缀为zip文件,解压zip文件,所要获取的内容在固定的文件夹下:work/temp/word/document.xml 所用包,全部是python自带,不需要额外下载安装. ...

  5. Spring Cloud 之 Eureka

    Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...

  6. java & maven pom

    java & maven pom https://maven.apache.org/pom.html http://www.tutorialspoint.com/maven/maven_pom ...

  7. post和updatebatch区别 delphi

    Post是确认当前的修改,而UpdateBatch是把已经确认但是没有存盘的数据写入数据库如果不是使用批量更新的方式的时候,Post的时候,确认的修改直接写入数据库. 我弄了一个例子是ado的.往数据 ...

  8. python判断字符串是否包含子字符串

    python的string对象没有contains方法,不可以使用string.contains的方法判断是否包含子字符串,但是python有更简单的方法来替换contains函数 python的st ...

  9. CF816E-Karen and Supermarket

    题目 Description 今天Karen要去买东西. 一共有 \(n\) 件物品,每件物品的价格为\(c_i\),同时每件物品都有一张优惠券,可以对这件物品减价 \(d_i\) . 使用第 \(i ...

  10. BZOJ 1799 同类分布(数位DP)

    给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1<=a<=b<=1e18. 注意到各位数字之和最大是153.考虑枚举这个东西.那么需要统计的是[0,a-1]和[0,b ...