324.Wiggle Sort II
1-Sort
这道题给了我们一个无序数组,让我们排序成摆动数组,满足nums[0] < nums[1] > nums[2] < nums[3]...,并给了我们例子。我们可以先给数组排序,然后在做调整。调整的方法是找到数组的中间的数,相当于把有序数组从中间分成两部分,然后从前半段的末尾取一个,在从后半的末尾去一个,这样保证了第一个数小于第二个数,然后从前半段取倒数第二个,从后半段取倒数第二个,这保证了第二个数大于第三个数,且第三个数小于第四个数,以此类推直至都取完,参见代码如下:
class Solution {
public void wiggleSort(int[] nums) {
Arrays.sort(nums);
int[] ans = new int[nums.length];
int mid = (nums.length + 1) / 2;
int left = mid;
int right = nums.length;
for(int i = 0; i < nums.length; i++){
if(i % 2 == 0){
ans[i] = nums[--left];
}
else{
ans[i] = nums[--right];
}
}
for(int i = 0; i < nums.length; i++){
nums[i] = ans[i];
}
}
}
2-
https://leetcode.com/problems/wiggle-sort-ii/discuss/77682/
public void wiggleSort(int[] nums) {
int median = findKthLargest(nums, (nums.length + 1) / 2);
int n = nums.length;
int left = 0, i = 0, right = n - 1;
while (i <= right) {
if (nums[newIndex(i,n)] > median) {
swap(nums, newIndex(left++,n), newIndex(i++,n));
}
else if (nums[newIndex(i,n)] < median) {
swap(nums, newIndex(right--,n), newIndex(i,n));
}
else {
i++;
}
}
}
private int newIndex(int index, int n) {
return (1 + 2*index) % (n | 1);
}
public void wiggleSort(int[] nums) {
int median=findKthLargest(nums,(nums.length+1)/2);
int odd=1;
int even=nums.length%2==0?nums.length-2:nums.length-1;
int[] tmpArr=new int[nums.length];
for(int i=0;i<nums.length;i++){
if(nums[i]>median){
tmpArr[odd]=nums[i];
odd+=2;
continue;
}
if(nums[i]<median){
tmpArr[even]=nums[i];
even-=2;
continue;
}
}
while(odd<nums.length){
tmpArr[odd]=median;
odd+=2;
}
while(even>=0){
tmpArr[even]=median;
even-=2;
}
for(int i=0;i<nums.length;i++){
nums[i]=tmpArr[i];
}
}