Leetcode:324. 摆动排序 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) 额外空间来实现吗?

思路:先对数组排序,分为大数部分和小数部分,再穿插排序。 注意顺序,例如[1,2,4,4,4,6]这个数组,通过降序穿插得到[4,6,2,4,1,4]。 如果顺序排列,则会得到[1,4,2,4,4,6]不满足要求。 这里是因为我们想尽量将小数部分的最大数放在边上(左边),这样只用靠近一个大数部分的最大数。
小数部分的最大数和大数部分的最小数应该尽可能远离。

class Solution {
    public void wiggleSort(int[] nums) {
        
        int[]numsss=nums;
        // Arrays.sort(numsss);nums中也会改变
        Arrays.sort(numsss);
        // int len  ,int 
        int len=nums.length;
        //[]
        //len-1
        int []numss=new int [len];
        int k=0;
        
        for(int i=(len-1)/2;i>=0;i--){
            numss[k]=nums[i];
            k=k+2;
            
            
        }
        k=1;
        for(int j=len-1;j>(len-1)/2;j--){
        	numss[k]=nums[j];
        	k=k+2;
        }

        for(int i=0;i<len;i++){
            nums[i]=numss[i];
        }
        }
    }

理解,与错误的代码:
1.
定义不要放在for循环中,每次都会被重新赋值的。
// for(int num:numss){
// int b=0;
// nums[b++]=num;
// }只能改变头一个!!

public void wiggleSort(int[] nums) {}
在此方法中,如有nums=numss;
nums在外的值是不会被改变的,要想改变,必须通过真实的地址赋值。
如:
for(int i=0;i<len;i++){
nums[i]=numss[i];
}

在下面代码中,在外的nums[]也会变,因为numsss有nums真实的地址,Array。sort调用了nums的真实地址进行了改变
public void wiggleSort(int[] nums) {
int[]numsss=nums;
// Arrays.sort(numsss);nums中也会改变
Arrays.sort(numsss);
}

下面的代码,在外的nums值不会变,因为nums指向的真实地址值在:
nums=numss;中被改变了,nums[0]改变的是numss中的指向的地址的值。
public void wiggleSort(int[] nums) {

    int len=nums.length;
    int []numss=new int[len];
    numss[0]=1;
    nums=numss;
    nums[0]=0;
    

}

新建一个数组:int[] arr=new int[6]; []=[6];

错思路:观察,为小大小…/小大小大…欲分为数组为偶数或是奇数来解决,代码如下:但是结果有错,而且这种方法需改进。
代码运行结果和自己逻辑推算不一致,待解决。

class Solution {
    public void wiggleSort(int[] nums) {
        Arrays.sort(nums);
        // int len  ,int 
        int len=nums.length;
        if(len/2==0){
            int j=len-2;
            for(int i=1;i<j;i=i+2){
                int tmp=nums[j];
                nums[j]=nums[i];
                nums[i]=tmp;
                j=j-2;
            
            }
            
            
        }
        
        else{
            int j=len-1;
            for(int i=1;i<j;i=i+2){
                int tmp=nums[j];
                nums[j]=nums[i];
                nums[i]=tmp;
                j=j-2;
            }
        }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值