标签:color condition 证明 == 位置 private sort one ssi
280 Given an unsorted array nums
, reorder it in-place such that nums[0] <= nums[1] >= nums[2] <= nums[3]...
.
Example:
Input:nums = [3,5,2,1,6,4]
Output: One possible answer is [3,5,1,6,2,4]
280要求的是可以大于等于,其实简单。
方法一:
1. 先排序,得到序列 a0<=a1<=a2<=a3<=a4....<ai<=ai+1
2. 然后从a1 开始,交换相邻的, 这样就会有a0<=a2>=a1<=a4>=a3<=an
class Solution { public void wiggleSort(int[] nums) { Arrays.sort(nums); for(int i=1; i<nums.length-1; i+=2){ swap(nums, i,i+1); } } private void swap(int[] nums, int i, int j){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } }
方法二: 上面的方法是 nlogn解法, 如何寻求一个On 的解法。
对于O(n) 显然只能扫描一遍数组,具体算法如下:
1. 在even index 上,比如index = 0, 如果 nums[i] > nums[i+1], 就交换
2. 在odd index 上, 比如index=1, 如果 nums[i] <nums[i+1] 就交换。
如何证明这个算法的正确性,用数学归纳法 Mathematical Induction, 可以证明。
证明如下: 假设已经用上面算法进行了排序,得到了:
a0<=a1>=a2<=a3>=a4<=....ak...
对于n = k+1 的情况,
if n = k+1 is even( 偶数需要在小的位置上), 说明 ak>=a(k+1) ,
如果 a(k+1) > a(k+2), 进行交换, 得到 ak >= a(k+2) <=a(k+1), 可以保持序列形状
如果a(k+a) <a(k+2) ,不用交换, 仍然可以保持ak<=a(k+1)<=a(k+2) , the order is also correct.
同理, if n =k+1 is odd ,仍然可以用归纳法证明。
class Solution { public void wiggleSort(int[] nums) { for(int i=0; i<nums.length-1; i++){ if(i%2 ==0 && nums[i] > nums[i+1] || i%2==1 && nums[i] <nums[i+1]) { //the condition need to swap swap(nums,i,i+1); } } } private void swap(int[] nums, int i, int j){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } }
对于324 把等于号去掉,保持严格的递增或者递减顺序:
Given an unsorted array nums
, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]...
.
去掉等于号,难度增加了很多,毕竟就算直接排序好了,也难保持严格递增。
280. Wiggle Sort/324. Wiggle Sort II
标签:color condition 证明 == 位置 private sort one ssi
原文地址:https://www.cnblogs.com/keepAC/p/10269922.html