LeetCode每日一题-324. 摆动排序 II精简思路

134 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

LeetCode每日一题-324. 摆动排序 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 ,总能产生满足题目要求的结果

先上代码

class Solution {
    public void wiggleSort(int[] nums) {
        int len = nums.length;
        int []rec=new int[len];
        for(int i=0;i<len;i++) rec[i]=nums[i];
        Arrays.sort(rec);
        int l=len%2==0?len/2-1:len/2,r=len-1,index=0;   //注意偶数和奇数从中间截断的位置不一样
        while(index<len){
            nums[index] = rec[(index&1)==0?l--:r--];
            index++;
        }
    }
}

思路

其实这道题想复杂了也会很复杂,先说一下具体的思路的过程:

  1. 第一步:因为nums[0] < nums[1] > nums[2] < nums[3] ,我们肯定会想到要想每一个的都满足条件,需要把大的一半和小的一半数据分开,然后分别的取值
  2. 第二步:从给出的例子,nums[0],nums[2],nums[4]...是小值,应该从小值的一半去取,相反nums[1],nums[3],nums[5]...是大值,应该从大的一半去取
  3. 既然确定的取值的思路,就是该怎么取了,因为nums[1]大于两边的小值,奇数位置如果从大值的一半从达到小取,为了确保取到最后还满足条件,小值的一半从也要从大到小去取,因为题中肯定有一个答案,就算小的一半从大到小去取,还是能满足条件的,这个小的一半之所以没有从小到大的去取,是因为如果小的一半取值不断变大,大的一半取值不断变小,取到最后不一定满足条件。
  4. 所以我们就确定了思路,排序后分为两半 大的一半小的一半,然后分别从两半的值中分别倒序取值

总结

注意一点,遇见这种题,我们需要常想到的是排序。

image.png