[LeetCode]324. Wiggle Sort II

Problem Description

Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]….

Example:
(1) Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6].
(2) Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2].

Note:
You may assume all input has valid answer.

Follow Up:
Can you do it in O(n) time and/or in-place with O(1) extra space?

思路

排序之后再倒序,然后大数字排奇数位,小数字排偶数位。。酱是O(nlgn)的。。。
O(n)的方法可能是先利用快排的思想找到中位数,然后通过中位数进行排列。。

Code

package Q324;

import java.util.Arrays;
import java.util.Collections;

public class Solution {
//  //Find the Kth smaller number
//  public static int getK_MinNum(int[]nums,int p,int nowp,int right,int left){
//      nowp=right;
//      int tmp=nums[right];
//      int [] newnums=new int[nums.length];
//      int l=right;int h=left;
//      for(int i=right+1;i<=left;i++){
//          if(nums[i]<tmp){
//              newnums[l++]=nums[i];
//              nowp++;
//          }
//          else{
//              newnums[h--]=nums[i];
//          }
//      }
//      newnums[l]=tmp;
//      if(nowp==p) return tmp;
//      else if(nowp<p) return getK_MinNum(newnums,p,nowp,h+1,left);
//      else return getK_MinNum(newnums,p, nowp,right,l-1);
//      
//  }

    public static void wiggleSort(int[] nums) {
        int len=nums.length;
        int [] newnums= new int[len];
        int i,j,tmp;
        Arrays.sort(nums);
        for(i=0;i<(len-1)/2+1;i++){
            tmp=nums[i];
            nums[i]=nums[len-1-i];
            nums[len-1-i]=tmp;
        }
        i=0;
        while(2*i+1<len){
             newnums[2*i+1]=nums[i];
             i++;
        }
        j=i;
        while(j<len&&2*(j-i)<len){
            newnums[2*(j-i)]=nums[j];
            j++;
        }
        for(i=0;i<nums.length;i++) nums[i]=newnums[i];

    }

//  public static void main(String[] args) {
//      int [] nums={1,2,3,4,5,6,7};
//      wiggleSort(nums);
//      for(int i=0;i<nums.length;i++)  System.out.print(nums[i]+" ");
//
//      
//      
//  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值