原题
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