LintCode Wiggle Sort II

本文介绍了一种解决数组大小交错排列的方法,包括先排序,然后将较小的数字放入偶数下标,较大的数字放入奇数下标。针对数组中有重复项导致的问题,通过额外的步骤将重复项进行交换来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

Given an unsorted array nums, reorder it such that

nums[0] < nums[1] > nums[2] < nums[3]....

Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6].

Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2].

    分享一种比较直观的解决本题的方法。要使得数组大小交错,很容易想到先排序,再将较小的一半数字放到偶数下标,将较大的一半数字放到奇数下标。问题就会得以解决。

    然而这种方法有一个漏洞。举个例子,测试数组为[1, 2, 2, 3]时,用上述方法求得的解为[1, 2, 2, 3],而正确解为[2, 3, 1, 2]。因此单纯的排序插入并不能解决由于数组重复项造成的问题。针对这种情况,我们可以再添加一步。如果经过上述操作后,若存在重复的项,则从重复项的位置将数组切开,并将前后两部分交换位置,再上述例子中就是将2,3和1,2交换位置,问题得以解决。

代码如下:

public class Solution {
    public void wiggleSort(int[] nums) {
        // Write your code here
        int l = nums.length;
        int i = 0;
        int[] extra = new int[l / 2];
        int[] ano = new int[l];
        int j = 0;
        Arrays.sort(nums);
        for (i = 0; i < l / 2; i++) {
            extra[i] = nums[i + (l + 1) / 2];
        }
        for (i = ((l - 1) / 2) * 2; i >= 0; i--) {
            nums[i] = nums[i / 2];
        }
        for (i = 0; i < l / 2; i++) {
            nums[i * 2 + 1] = extra[i];
        }
        for (i = 0; i < l - 1; i++) {
            if (nums[i] == nums[i + 1]) {
                for (j = 0; j <= i; j++) {
                    ano[j] = nums[j];
                }
                for (j = 0; j < l-i-1; j++) {
                    nums[j] = nums[j + l - i - 1];
                }
                for (j = 0; j <= i; j++) {
                    nums[j + l - i - 1] = ano[j];
                }
            }
        }
    }
}

    本问题中的边界条件的计算比较复杂,需十分仔细。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值