leetcode 324. 摆动排序 II
作者:互联网
题目描述:
给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
你可以假设所有输入数组都可以得到满足题目要求的结果。
链接:https://leetcode-cn.com/problems/wiggle-sort-ii
解题思路:
我一开始想的是先对数组排序,然后按下标分为大 小两部分,然后从这两个数组左边开始,小的压进结果数组一个,再压入一个大的,可是这种情况不能避免中间重复元素,比如[4,5,5,6],按这种思路得到的是[4,5,5,6],显然这不符合题意,那问题出在哪呢?就出在第二个5被放进了4和第一个5之间,要是这里放6就好了,如果从小数组的左边和大数组的右边开始,那么结果是[4,6,5,5],也不对,这样两遍最后都会走到原数组的中间部分,重复元素势必会相遇。
必须一开始就把他们分开,那就干脆都从右边开始,这样中间部分会被放在小数组的前面,大数组的后面。
c++代码:
class Solution {
public:
void wiggleSort(vector<int>& nums) {
/*if(nums.size()==1) return;
if(nums.size()==2){
sort(nums.begin(),nums.end());
return;
}*/
vector<int> numsmin;
sort(nums.begin(),nums.end());
if(nums.size()%2==0){
for(int i=nums.size()/2-1;i>=0;i--){
numsmin.push_back(nums[i]);
numsmin.push_back(nums[i+nums.size()/2]);
}
nums=numsmin;
return;
}
for(int i=nums.size()/2;i>=1;i--){
numsmin.push_back(nums[i]);
numsmin.push_back(nums[i+nums.size()/2]);
}
if(nums.size()%2!=0) numsmin.push_back(nums[0]);
nums=numsmin;
return;
}
};
标签:数组,numsmin,nums,back,II,324,push,leetcode,size 来源: https://blog.csdn.net/Lookatm1/article/details/116032104