题目描述:

Given an unsorted array nums, reorder it such that

nums[0] < nums[1] > nums[2] < nums[3]....
Notice

You may assume all input has valid answer.

Have you met this question in a real interview?

Yes

Example

Given nums = [1, 5, 1, 1, 6, 4], one possible answer is[1, 4, 1, 5, 1, 6].

Given nums = [1, 3, 2, 2, 3, 1], one possible answer is[2, 3, 1, 3, 1, 2].

题目思路:

最简单的方法是将数组排序后,按照wiggle sort的规律重新分配数字。但是题目的要求为O(n),而quick sort或merge sort的时间复杂度均为O(nlogn),在此并不可行。这题在算法上参考了九章的java version答案:用quicksort的思想得到中间数mid,然后根据数组长度的奇偶分配element。这里要注意的是,为了避免出现相邻数字相等的情况,分配时需要将重复的mid分配在数组两头。

Mycode(AC = 83ms):

class Solution {
public:/*** @param nums a list of integer* @return void*/  void wiggleSort(vector<int>& nums) {// Write your code hereif (nums.size() <= 1) return;vector<int> tmp(nums);int mid = partition(tmp, 0, tmp.size() - 1, tmp.size() / 2);vector<int> ans(nums.size(), mid);// assign the numbers if nums.size() is oddif (nums.size() % 2 == 1) {int l = 0, r = nums.size() - 2;for (int i = 0; i < nums.size(); i++) {if (nums[i] > mid) {ans[r] = nums[i];r -= 2;}else if (nums[i] < mid) {ans[l] = nums[i];l += 2;}}}// assign the numbers if nums.size() is evenelse {int l = 1, r = nums.size() - 2;for (int i = 0; i < nums.size(); i++) {if (nums[i] < mid) {ans[r] = nums[i];r -= 2;}else if (nums[i] > mid) {ans[l] = nums[i];l += 2;}}}nums = ans;}// use partition function to get the mid number, note that the // nums will be changed by doing thisint partition(vector<int>& nums, int start, int end, int rank) {int left = start, right = end;int now = nums[start];while (left < right) {while (left < right && nums[right] >= now) {right--;}nums[left] = nums[right];while (left < right && nums[left] <= now) {left++;}nums[right] = nums[left];}if (left - start == rank) { // if left is in the middlereturn now;}else if (left - start < rank) { // if 'left' is in left of the middlepartition(nums, left + 1, end, rank - (left - start + 1));}else {// if 'left' is in right of the middlepartition(nums, start, left - 1, rank);}}};

#507 Wiggle Sort II相关推荐

  1. 324. Wiggle Sort II

    /** 324. Wiggle Sort II* 2016-7-7 by Mingyang* 我想利用I的思路,设立一个list,sort以后从头尾分别加,但是遇到1122233就不行了* 因为这里是 ...

  2. LeetCode Wiggle Sort II(快排)

    问题:给出一个无序数组,将它重新排列成nums[0]<nums[1]>nums[2]<nums[3]... 思路:将无序数组排序后,从中间及最后下标开始相间的填入值. 具体代码参考: ...

  3. 324. Wiggle Sort II | 324. 摆动排序 II(降序穿插)

    题目 https://leetcode.com/problems/wiggle-sort-ii/submissions/ 题解 没有一次想到正确的方法,是在 WA 的测试用例的提示下,一点一点修正,才 ...

  4. [Swift]LeetCode324. 摆动排序 II | Wiggle Sort II

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  5. LeetCode Wiggle Sort II

    1232131 转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10936707.html

  6. 【LeetCode 剑指offer刷题】查找与排序题14:Wiggle Sort(系列)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Wiggle Sort II Given an unsorted array nums, reorder it su ...

  7. [Leetcode] Wiggle Sort 摇摆排序

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

  8. C++Wiggle Sort摆动排序的实现算法(附完整源码)

    C++Wiggle Sort摆动排序的实现算法 C++Wiggle Sort摆动排序的实现算法完整源码(定义,实现,main函数测试) C++Wiggle Sort摆动排序的实现算法完整源码(定义,实 ...

  9. 280. Wiggle Sort

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

  10. 280. Wiggle Sort

    最后更新 二刷 这个题做得真蠢.上来想的复杂了,想的是quick sort之类的,然后一个一个交换. 实际上直接交换就行..没啥特别的. 回头看一刷也是同样的思考过程= =宿命论啊.. Time: O ...

最新文章

  1. windows CPU性能监控命令
  2. 商业大佬提醒:如果不采取措施,美国在人工智能领域将落后于中国
  3. 2021年春季学期-信号与系统-第四次作业参考答案-MATLAB实验题2
  4. 如何从 0 到 1 打造团队 PC/H5 构建工具
  5. Apache beam其他学习记录
  6. KVM 虚拟机在物理主机之间迁移的实现 -- 静态迁移/动态迁移/存储迁移
  7. 线程池很难么?带你从头到尾捋一遍,不信你听不懂!
  8. python中threading模块中的Join类
  9. 似然函数(likelihood function)
  10. 基于visual Studio2013解决面试题之0909移动星号
  11. python爬取邮件内容_Python实现获取邮箱内容并解析的方法示例
  12. 生活情景英语:英语国家生存英语精选
  13. 高级需求分析师培训要点,如何正确编写需求用例的5个提示!
  14. 基于PHP+小程序(MINA框架)+Mysql数据库的共享会议室预约小程序系统设计与实现
  15. 地铁工程安全生产预警系统价格
  16. 《国际贸易术语解释通则》概述中关于2000年通则的主要内容
  17. 一些简单的css,html,js笔记分享给大家,希望能够帮助到大家
  18. java学生成绩统计
  19. 容器服务(四): Kubernetes 搭建与核心原理
  20. 什么是cmnet和cmwap

热门文章

  1. 为什么DataGridView不出现滚动条?它的ScrollBars属性我设置为Both了
  2. 基于Python的指数基金量化投资——指数基金估值榜
  3. SQL2008用户sa登录失败(错误18456)解决方法
  4. 透视虎牙斗鱼三季报:游戏直播在各自“求变”中见分晓
  5. 朱淑真 潸然看断梨花落
  6. html调色板快捷键,CSS color设置与调色板
  7. LTE手机接收灵敏度究竟如何?
  8. Shell脚本中各种括号用法
  9. 时间序列分析 | 相似性度量基本方法
  10. Linux学习第一节课学习心得