思路:
先将数组排序,然后将排序后的数组分成两半:较小的一半和较大的一半。
为了避免相同元素相邻,需要从两半的末尾开始,依次交替填入原数组的偶数位和奇数位:
· 偶数位填较小的一半(从后往前)
· 奇数位填较大的一半(从后往前)
这样就能保证 nums[0] < nums[1] > nums[2] < nums[3] …。
Java 实现:
importjava.util.Arrays;classSolution{publicvoidwiggleSort(int[]nums){intn=nums.length;int[]sorted=nums.clone();Arrays.sort(sorted);intmid=(n+1)/2;// 较小一半的末尾索引 + 1intj=mid-1;// 较小一半从后往前intk=n-1;// 较大一半从后往前for(inti=0;i<n;i++){if(i%2==0){nums[i]=sorted[j--];}else{nums[i]=sorted[k--];}}}}复杂度:
· 时间复杂度:O(n log n),主要来自排序。
· 空间复杂度:O(n),使用了一个辅助数组。
示例:
int[]nums={1,5,1,1,6,4};wiggleSort(nums);// 结果可能为 [1, 6, 1, 5, 1, 4]// 满足 1 < 6 > 1 < 5 > 1 < 4注意:从后往前填充是为了避免重复元素在交替时相邻相等,例如 [4,5,5,6] 若正着填会得到 [4,5,5,6] 不合法,从后往前填则能得到 [5,6,4,5]。