Wiggle Sort II——LeetCode

483 阅读1分钟

题目描述

思路

一种比较naive的做法是先对数组进行排序

  • 从左往右奇数索引位置放大于中位数的数
  • 从右往左在偶数索引位置放小于中位数的数
  • 剩下的位置都放中位数
  • 其时间复杂度为O(nlog(n)), 空间复杂度为O(n)

代码

class Solution {
    public void wiggleSort(int[] nums) {
        Arrays.sort(nums);
        int len = nums.length;
        int mid = 0;
        if(nums.length % 2 == 0){
            mid = (nums[len / 2] + nums[len / 2 - 1])/2;
        }else{
            mid = nums[len / 2];
        }
        int[] temp = new int[len];
        for(int i = 0; i<len;i++){
            temp[i] = mid;
        }
        int end = len -1;
        for(int i = 1; i < len;i = i + 2){
            if(nums[end] > mid){
                temp[i] = nums[end];
            }else{
                break;
            }
            end--;
        }
        int start = 0;
        for(int i = (len%2==0)? len - 2 : len - 1;i >=0; i = i-2 ){
            if(nums[start] < mid){
                temp[i] = nums[start];
            }
            start++;
        }
        for(int i = 0;i<len;i++){
            nums[i] = temp[i];
        }
        // nums = temp;
    }
}