324. Wiggle Sort II
来源:互联网 发布:淘宝网店图标尺寸 编辑:程序博客网 时间:2024/06/01 09:33
原题
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]….
Example:
(1) Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6]. (2) Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2].
Note:
You may assume all input has valid answer.
Follow Up:
Can you do it in O(n) time and/or in-place with O(1) extra space?
代码实现
Based on quick sort, we get the median number, then want a method to put the greater median at index 1, 3, 5, …; put less median at index 0, 2, 4, ….; equal median keeping still.
Thanks for the solution and I referred this solution:
https://leetcode.com/problems/wiggle-sort-ii/#/solutions
/// <summary> /// WiggleSort /// </summary> public class WiggleSortSln { private static int[] _array; public int[] WiggleSort(int[] array) { _array = array; int median = findKThLargest(_array.Length / 2); int left = 0, i = 0, right = _array.Length - 1; while (i <= right) { if (_array[newIndex(i)] > median) { //put newIndex(i) at odd index(from 1, 3, to 5, ...) swap(newIndex(left++), newIndex(i)); i++; } else if (_array[newIndex(i)] < median) { //put newIndex(i) at even index(max even index to little .... ) swap(newIndex(right--), newIndex(i)); //right--, so i relatively toward right 1 step } else { i++; } } return _array; } private int newIndex(int index) { return (1 + 2 * index) % (_array.Length | 1); } private void swap(int i, int j) { int tmp = _array[i]; _array[i] = _array[j]; _array[j] = tmp; } //based on quick sort to find the Kth largest in _array private int findKThLargest(int k) { int left = 0; int right = _array.Length - 1; while (true) { int pivotIndex = quickSort(left, right); if (k == pivotIndex) return _array[pivotIndex]; else if (k < pivotIndex) right = pivotIndex - 1; else left = pivotIndex + 1; } } private int quickSort(int lo, int hi) { int key = _array[lo]; while (lo < hi) { while (lo < hi && _array[hi] >= key) hi--; //hi is less than key, hi element moves to lo index _array[lo] = _array[hi]; while (lo < hi && _array[lo] < key) lo++; //lo is bigger than key, lo element moves to hi index _array[hi] = _array[lo]; } _array[lo] = key; return lo; } }
leetcode-solution库
leetcode算法题目解决方案每天更新在github库中,欢迎感兴趣的朋友加入进来,也欢迎star,或pull request。https://github.com/jackzhenguo/leetcode-csharp
阅读全文
1 1
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II**
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- 324. Wiggle Sort II
- # 324. Wiggle Sort II
- 324. Wiggle Sort II
- 计算Java中任意一个方法的执行时间的工具类
- 记录Android Studio提交代码忽略配置
- DNS解析过程详解
- Windows下 64 的memcached的安装
- Option
- 324. Wiggle Sort II
- Python 自启动&监听进程 服务
- PBS作业提交后,输出错误MPI_Aobrt
- java使用condition进行线程通信
- iptables
- JAVA开发之 30-java的数组的12个最佳方法
- 数据中心 FailOver 后避免数据错乱的关键做法
- 自定义 SimpleVG
- 二叉查找树