算法初探LeetCode-摆动排序 II

76 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

LeetCode324:摆动排序 II

给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。
你可以假设所有输入数组都可以得到满足题目要求的结果。

示例 1:

输入:nums = [1,5,1,1,6,4]
输出:[1,6,1,5,1,4]
解释:[1,4,1,5,1,6] 同样是符合题目要求的结果,可以被判题程序接受

示例 2:

输入: nums = [1,3,2,2,3,1]
输出: [2,3,1,3,1,2]

提示:

1 <= nums.length <= 5 * 104
0 <= nums[i] <= 5000
题目数据保证,对于给定的输入 nums ,总能产生满足题目要求的结果

思路分析

根据题目和给出的示例分析得知,将原数组分成小的一半和大的一半,然后进行穿插构成答案数组,但是这样会一个问题。例如:5 4 5 6这个样例采用上述方法得到:4 5 5 6,显然是错误答案,因此我们可以考虑小的一半和大的一半倒着插进去即可满足。可以证明在输入满足一定能够构成答案的前提下这个方法一定是正确的。

算法代码

public void wiggleSort(int[] nums) {
    Arrays.parallelSort(nums);  //  先排序
    int len=nums.length,i=0;
    int[] smaller=new int[len%2==0?len/2:len/2+1],bigger=new int[len/2];
    System.arraycopy(nums, 0, smaller, 0, smaller.length);
    System.arraycopy(nums, smaller.length, bigger, 0, len/2);
    for(;i<len/2;i++) {
        nums[2*i]=smaller[smaller.length-1-i];
        nums[2*i+1]=bigger[len/2-1-i];
    }
    if(len%2!=0) nums[2*i]=smaller[smaller.length-1-i];
}

结果详情

Snipaste_2022-12-28_23-18-44.png

算法复杂度

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!