☰
DeepSeek LeetCode 324. 摆动排序 II Java实现
2026/10/14 3:27:36 网站建设 项目流程

思路:
先将数组排序,然后将排序后的数组分成两半:较小的一半和较大的一半。
为了避免相同元素相邻,需要从两半的末尾开始,依次交替填入原数组的偶数位和奇数位:

· 偶数位填较小的一半(从后往前)
· 奇数位填较大的一半(从后往前)

这样就能保证 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]。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询