中级农民
- 积分
- 100
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-10-10
- 最后登录
- 1970-1-1
|
本帖最后由 mumu007 于 2016-1-7 03:04 编辑
- class Solution {
- public:
- int quickSelect(vector<int>& nums, int left, int right, int n) {
- // http://www.hrwhisper.me/leetcode-wiggle-sort-ii/
- if(left >= right) return nums[right];
- int start = left, end = right + 1;
- int mid = nums[left];
- while(start < end) {
- while(++start < right && nums[start] < mid) ;
- while(--end > left && nums[end] > mid) ;
- if(start >= end) break;
- swap(nums[start], nums[end]);
- }
- swap(nums[left], nums[end]);
- if(n == end - left + 1) return nums[end];
- else if(n < end - left + 1) return quickSelect(nums, left, end - 1, n);
- else return quickSelect(nums, end + 1, right, n - (end - left + 1));
- }
- int transformInd(int i, int len) {
- if(i < (len >> 1)) return i*2+1;
- else return (i - (len>>1))*2;
- }
- void wiggleSort(vector<int>& nums) {
-
- int len = nums.size();
- if(len < 2) return ;
- int median = quickSelect(nums, 0, len - 1, (len + 1) >> 1);
- int i = 0, j = 0, k = len - 1;
- while(i <= k) {
- int iT = transformInd(i, len), jT = transformInd(j, len), kT = transformInd(k, len);
- if(nums[iT] > median) {
- swap(nums[iT], nums[jT]);
- i++;
- j++;
- }
- else if(nums[iT] < median) {
- swap(nums[iT], nums[kT]);
- k--;
- }
- else i++;
- }
- }
- };
复制代码 c++抛砖引玉,看过楼上的原帖写的,transformInd的作用就相当于
#define A(i) nums[(1+2*(i)) % (n|1)]// Index-rewiring. |
|