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 };
View Code

 

posted @ 2021-11-07 17:27  zhaohhhh  阅读(33)  评论(0)    收藏  举报