leetcode-324-摆动排序 II-java

题目及测试

package pid324;
/*  摆动排序 II

给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。

示例 1:

输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]

示例 2:

输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]

说明:
你可以假设所有输入都会得到有效的结果。

进阶:
你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?

*/


public class main {
	
	public static void main(String[] args) {
		int[][] testTable = {
  {1, 5, 1, 1, 6, 4},{1, 3, 2, 2, 3, 1},{1,0,1,3,0,4,0,2,0,2},{0,6,2,7,0}};
		for (int[] ito : testTable) {
			test(ito);
		}
	}
		 
	private static void test(int[] ito) {
		Solution solution = new Solution();
		long begin = System.currentTimeMillis();
		for (int i = 0; i < ito.length; i++) {
		    System.out.print(ito[i]+" ");		    
		}
		System.out.println();
		//开始时打印数组
		
		 solution.wiggleSort(ito);//执行程序
		long end = System.currentTimeMillis();	
		
		//System.out.println(ito + ": rtn=" + rtn);
		System.out.println("rtn=" );
		for (int i = 0; i < ito.length; i++) {
		    System.out.print(ito[i]+" ");
		}//打印结果几数组
		
		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

没想出来

解法1(别人的)

有一个数组[a1,a2,...,an],我们怎么把它排成摇摆序列呢?

由摇摆序列的定义:nums[0] < nums[1] > nums[2] < nums[3]...,我们知道了可以分成较大一部分的数和较小一部分数,然后互相穿插即可。比如一个数组排序后为:A=[a1,a2,...,an] (a1<=a2<=....<=an),然后分成较小和较大的两部分[a1,a2,...,a(n/2)],[a(n/2+1),...,an](数组长度为奇数时不影响),再进行穿插操作。
那是不是穿插成[a1,a(n/2+1),a2,a(n/2+2),...,an]就行了呢?

其实不对,可以验证特殊情况:n比较小时且为偶数时,穿插后的序列需要满足a(n/2+1)>a2,如果a1<a2<=a(n/2+1)<an,a(n/2+1)正好是a2的后一项且与a2相等呢?即如果是[4,5,5,6]的情况呢?
那就分成了[4,5],[5,6]两部分,之后穿插成的是[4,5,5,6]并不是摇摆序列。
应该怎样排列呢?

为了方便阅读,我们在下文中定义较小的子数组为数组A,较大的子数组为数组B。显然,出现上述现象是因为nums中存在重

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值