本文已参与[新人创作礼]活动,一起开启掘金创作之路。
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++;
}
}
}
思路
其实这道题想复杂了也会很复杂,先说一下具体的思路的过程:
- 第一步:因为nums[0] < nums[1] > nums[2] < nums[3] ,我们肯定会想到要想每一个的都满足条件,需要把大的一半和小的一半数据分开,然后分别的取值
- 第二步:从给出的例子,nums[0],nums[2],nums[4]...是小值,应该从小值的一半去取,相反nums[1],nums[3],nums[5]...是大值,应该从大的一半去取
- 既然确定的取值的思路,就是该怎么取了,因为nums[1]大于两边的小值,奇数位置如果从大值的一半从达到小取,为了确保取到最后还满足条件,小值的一半从也要从大到小去取,因为题中肯定有一个答案,就算小的一半从大到小去取,还是能满足条件的,这个小的一半之所以没有从小到大的去取,是因为如果小的一半取值不断变大,大的一半取值不断变小,取到最后不一定满足条件。
- 所以我们就确定了思路,排序后分为两半 大的一半 和 小的一半,然后分别从两半的值中分别倒序取值
总结
注意一点,遇见这种题,我们需要常想到的是排序。