LeetCode_324摆动排序II

给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
在这里插入图片描述

class Solution {
    /*
    * 基本思路:
    * 1、桶排序
    * 2、从中间分成两部分
    * 3、每部分从高到低取元素
    * 4、添加到数组中
    */
    public void wiggleSort(int[] nums) {
        int n = nums.length;
    	int k = n;
    	int min = Integer.MAX_VALUE;
    	int max = Integer.MIN_VALUE;
    	for(int i=0;i<n;i++) {
    		min = Math.min(min, nums[i]);
    		max = Math.max(max, nums[i]);
    	}
    	int D_value = max-min;//差值
    	int count = D_value/k+1;//所需桶的个数
    	List<List<Integer>> lists = new ArrayList<List<Integer>>();
    	for(int i=0;i<count;i++) {
    		List<Integer> list = new ArrayList<Integer>();
    		lists.add(list);
    	}
        //将数据添加到对应的桶中
    	for(int i=0;i<n;i++) {
    		int block = (nums[i]-min)/k;
    		List<Integer> list = lists.get(block);
    		list.add(nums[i]);
    	}
        //将每个桶中的数据进行排序
        for(int i=0;i<lists.size();i++){
            List<Integer> list = lists.get(i);
    	    Collections.sort(list);
        }
        int[] res = new int[n];
    	int index = 0;
    	for(int i=0;i<lists.size();i++) {
    		List<Integer> list = lists.get(i);
    		for(int j=0;j<list.size();j++) {
    			res[index++] = list.get(j);
    		}
    	}
        int mid = (n-1)/2;
        int high = n-1;
        for(int i=0;i<n;i++){
            if(i%2==0){
                nums[i] = res[mid--];
            }else{
                nums[i] = res[high--];
            }
        }
    }
}
发布了250 篇原创文章 · 获赞 0 · 访问量 1246

猜你喜欢

转载自blog.csdn.net/qq_36198826/article/details/103964547