#507 Wiggle Sort II
题目描述:
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.
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相关推荐
- 324. Wiggle Sort II
/** 324. Wiggle Sort II* 2016-7-7 by Mingyang* 我想利用I的思路,设立一个list,sort以后从头尾分别加,但是遇到1122233就不行了* 因为这里是 ...
- LeetCode Wiggle Sort II(快排)
问题:给出一个无序数组,将它重新排列成nums[0]<nums[1]>nums[2]<nums[3]... 思路:将无序数组排序后,从中间及最后下标开始相间的填入值. 具体代码参考: ...
- 324. Wiggle Sort II | 324. 摆动排序 II(降序穿插)
题目 https://leetcode.com/problems/wiggle-sort-ii/submissions/ 题解 没有一次想到正确的方法,是在 WA 的测试用例的提示下,一点一点修正,才 ...
- [Swift]LeetCode324. 摆动排序 II | Wiggle Sort II
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- LeetCode Wiggle Sort II
1232131 转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10936707.html
- 【LeetCode 剑指offer刷题】查找与排序题14:Wiggle Sort(系列)
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Wiggle Sort II Given an unsorted array nums, reorder it su ...
- [Leetcode] Wiggle Sort 摇摆排序
Wiggle Sort Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= ...
- C++Wiggle Sort摆动排序的实现算法(附完整源码)
C++Wiggle Sort摆动排序的实现算法 C++Wiggle Sort摆动排序的实现算法完整源码(定义,实现,main函数测试) C++Wiggle Sort摆动排序的实现算法完整源码(定义,实 ...
- 280. Wiggle Sort
题目: Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] ...
- 280. Wiggle Sort
最后更新 二刷 这个题做得真蠢.上来想的复杂了,想的是quick sort之类的,然后一个一个交换. 实际上直接交换就行..没啥特别的. 回头看一刷也是同样的思考过程= =宿命论啊.. Time: O ...
最新文章
- windows CPU性能监控命令
- 商业大佬提醒:如果不采取措施,美国在人工智能领域将落后于中国
- 2021年春季学期-信号与系统-第四次作业参考答案-MATLAB实验题2
- 如何从 0 到 1 打造团队 PC/H5 构建工具
- Apache beam其他学习记录
- KVM 虚拟机在物理主机之间迁移的实现 -- 静态迁移/动态迁移/存储迁移
- 线程池很难么?带你从头到尾捋一遍,不信你听不懂!
- python中threading模块中的Join类
- 似然函数(likelihood function)
- 基于visual Studio2013解决面试题之0909移动星号
- python爬取邮件内容_Python实现获取邮箱内容并解析的方法示例
- 生活情景英语:英语国家生存英语精选
- 高级需求分析师培训要点,如何正确编写需求用例的5个提示!
- 基于PHP+小程序(MINA框架)+Mysql数据库的共享会议室预约小程序系统设计与实现
- 地铁工程安全生产预警系统价格
- 《国际贸易术语解释通则》概述中关于2000年通则的主要内容
- 一些简单的css,html,js笔记分享给大家,希望能够帮助到大家
- java学生成绩统计
- 容器服务(四): Kubernetes 搭建与核心原理
- 什么是cmnet和cmwap