leetcode 324 摆动排序
最基本的思路是将数组首先进行排序,然后按照大小分为长度相同或者相差1个的两部分,之后将这两个数组的值插空放置在原数组中。这样的解法有个问题,就是如果两个数组中有相同的数,并且该数的数量到达了所有元素的一般,正序去进行填充就会发生相同元素相邻的问题。而这个问题来源于小的元素在数组开头,如果是大的元素在数组开头,就不会有这样的问题。所以可以使用逆序填充的方式规避这样的问题。这样就完成了一种解法,而这种解法中用到了排序,实际上两个数组内部并不需要有序,只需要找出数组中的中位数,然后将小于他的放在其左边,大于他的放在他右边,即可解决问题。贴代码
1 class Solution { 2 public: 3 void wiggleSort(vector<int>& nums) 4 { 5 auto midPointer = nums.begin() + nums.size()/2; 6 nth_element(nums.begin(),midPointer,nums.end()); 7 int midNum = *midPointer; 8 //三分 9 int i = 0; 10 int j = 0; 11 int k = nums.size()-1; 12 while(j<k) 13 { 14 if(nums[j]>midNum) 15 { 16 swap(nums[j],nums[k]); 17 k--; 18 } 19 else if(nums[j]<midNum) 20 { 21 swap(nums[j],nums[i]); 22 i++; 23 j++; 24 } 25 else 26 j++; 27 } 28 //逆序插入 29 //midPointer后面的都是第二个数组的 30 if(nums.size()%2) 31 midPointer++; 32 vector<int> nums1(nums.begin(),midPointer); 33 vector<int> nums2(midPointer,nums.end()); 34 for(int i = 0 ; i < nums1.size() ; i++) 35 nums[2*i] = nums1[nums1.size()-1-i]; 36 for(int i = 0 ; i < nums2.size() ; i++) 37 nums[2*i+1] = nums2[nums2.size()-1-i]; 38 } 39 };

浙公网安备 33010602011771号