您的位置:首页 > 其它

Wiggle Sort

2016-07-20 12:26 337 查看
Given an unsorted array
nums
, reorder it in-place such that
nums[0] <= nums[1] >= nums[2] <= nums[3]...
.

For example, given
nums = [3, 5, 2, 1, 6, 4]
, one possible answer is
[1, 6, 2, 5, 3, 4]
.

思路:这题主要在观察规律,并且证明算法的可行性。

nums[0]<=nums[1]>=nums[2]<=nums[3>=nums[4]

nums[i-2]<=nums[i-1] >= nums[i]

如果index为偶数,nums应该在左右中间。

如果index为奇数,应该比两边的大。

假设,0~i-1,已经wiggit好了,加入i,那么存在两种情况:

1. i%2==0,加进去的数,index为偶数, 则前面一个数是波峰。

if nums[i-1]>=nums[i] , nothing to do.

if nums[i-1]<=nums[i], 因为nums[i-2]<=nums[i-1], swap (nums[i-1] nums[i]),  则nums[i-2]<=nums[i]>=nums[i-1],满足条件。

2. i%2!=0, 加进去的数,index为奇数,则前面一个数是波谷。

if nums[i-1]<=nums[i], nothing to do.

if nums[i-1]>=nums[i], 因为nums[i-2]>=nums[i-1], swap (nums[i-1], nums[i]), 则 nums[i-2]>=nums[i]<=nums[i-1],满足条件。

所以,这样子swap可以保证整个array是波浪形的。

public class Solution {
public void wiggleSort(int[] nums) {
if(nums == null || nums.length <=1) return;
for(int i=1; i<nums.length; i++){
if(i%2 == 0 && nums[i-1]<=nums[i]){
swap(nums, i);
}
if(i%2!=0 && nums[i-1]>=nums[i]){
swap(nums, i);
}
}
}

public void swap(int[] nums, int index) {
int temp = nums[index];
nums[index] = nums[index-1];
nums[index-1] = temp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: