Leetcode Wiggle Sort II

112 篇文章 0 订阅
题意:

        随意给出一列数,把他变成大小上下振荡的序列。

思路:

        先排序,分成前后两部分,再两两匹配,形成一大一小的数对。


        先上WA的代码:

int cmp(const void *a, const void *b){
    return *(int*)a-*(int*)b;
}

void wiggleSort(int* nums, int numsSize) {
    int i=0,j=0,k=0;
    int r[numsSize];
    qsort(nums,numsSize,sizeof(int),cmp);
    if(numsSize%2==0){
        j=numsSize/2;
    }
    else{
        j=numsSize/2+1;
    }
    for(k=0,i=0;k<numsSize;++k){
        if(k%2==0){
            r[k]=nums[i];
            ++i;
        }
        else{
            r[k]=nums[j];
            ++j;
        }
    }
    for(i=0;i<numsSize;++i){
        nums[i]=r[i];
    }
    return;
}
这个 代码是从小到大遍历的。虽然可以保证一对数的大小关系,但是相邻数对的大小关系无法保证。如[4,5,5,6]。

这是通过的代码:

int cmp(const void* a, const void* b){
    return *(int*)a-*(int*)b;
}

void wiggleSort(int* nums, int numsSize) {
    int i=0,j=0,k=0;
    int r[numsSize];
    for(i=0;i<numsSize;++i){
        r[i]=nums[i];
    }
    qsort(r,numsSize,sizeof(int),cmp);
    for(i=(numsSize+1)/2-1,j=numsSize-1;j>(numsSize+1)/2-1||i>=0;--j,--i){
        if(k<numsSize&&i>=0){
            nums[k]=r[i];
            ++k;
        }
        if(k<numsSize&&j>(numsSize+1)/2-1){
            nums[k]=r[j];
            ++k;
        }
    }
    return;
}
这个代码是从大到小遍历的。既可以保证一对书直接的大小关系,也可以保证相邻数对的大小关系。

这两个代码产生的数对是形同的,数对的排列方式不同。前者是由小到大,后者是由大到小。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值