324. Wiggle Sort II

本文深入探讨了如何实现数组的波动排序,通过示例详细解释了排序过程,并对比了不同实现方式的效果,揭示了处理重复元素的重要性。

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

Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]…
Example 1:

Input: nums = [1, 5, 1, 1, 6, 4]
Output: One possible answer is [1, 4, 1, 5, 1, 6].

Example 2:

Input: nums = [1, 3, 2, 2, 3, 1]
Output: One possible answer is [2, 3, 1, 3, 1, 2].

Note:
You may assume all input has valid answer.

Follow Up:
Can you do it in O(n) time and/or in-place with O(1) extra space?

这道题,我开始就想,很简单啊,先把nums排序,小的数放在偶数位,大的数放在奇数位,这样就ok了。

class Solution {
    public void wiggleSort(int[] nums) {
        Arrays.sort(nums);
		int n = nums.length;
		int[] arr = new int[n];
		int j = 0;
		int count = 0; 
		for(int i = 0; j < n ; i++) {  //先把最小的几个数放在奇数位上
			arr[j] = nums[i];
			j += 2;
			count++;
		}
		
		for(int i = 1 ; count < n    ; i += 2) {   //把剩下排好序的大数放在剩下的偶数位上
			arr[i] = nums[count];
            count++;
		}


		for(int i = 0 ; i < n ; i++) {
			nums[i] = arr[i];
		}
    }
}

但是,我提交后,发现自己错了,Wrong Answer
错误的案例是:[4,5,5,6]
这时候,我才发现了自己没有考虑重叠元素。看了discuss,有个人总结的很多,但是我就是看不懂啊,后来在百度搜了搜,发现了一个人的答案,他的思路和我之前的一样,但是我运行他的答案,竟然对了!
仔细一看,发现了我与人家的区别,他是采用倒叙的方式,先把大的数放在奇数位,然后把小的数放在偶数位,(而我是先把小的数放在偶数位,在把大的数放在奇数位),不过我感觉这位应该对的也是凑巧,因为他说也可以先放小的,但是我先放小的就错了。。。

正确的答案:

class Solution {
    public void wiggleSort(int[] nums) {
        Arrays.sort(nums);
        int[] arr = new int[nums.length];
        int i = 1,j=0,k=nums.length-1;
        while(i<arr.length){
            arr[i]=nums[k--];
            i+=2;
        }
        while(j<arr.length){
            arr[j] = nums[k--];
            j+=2;
        }
        for(int x=0;x<nums.length;x++){
            nums[x] = arr[x];
        }
    }
}

答案来自:324. Wiggle Sort II

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值