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