7-3 小L的难题 (15 分)

最近,小L遇到了一道难题,请你帮帮他。

给出n个数,请找出这个序列的任意两个不同的数第二小的差值。ai​和 aj​的差值定义为∣ai​−aj​∣,即两个数差的绝对值,其中i和j互不相同。(第二小即从小到大排序之后的第二个数字)

输入格式:

第一行为一个正整数n (3≤n≤105),代表数组的长度。

接下来一行,共n个整数ai​(−109≤ai​≤109)。

输出格式:

输出一个数字,表示这个序列的任意两个不同的数中第二小的差值。

样例1

样例输入

6
11 4 7 1 16 2

结尾无空行

样例输出

2

结尾无空行

样例2

样例输入

6
10 1 2 4 15 6

结尾无空行

样例输出

2

结尾无空行

样例3

样例输入

6
6 8 10 4 3 2

结尾无空行

样例输出

1

结尾无空行

#include<stdio.h>
int a[100010],b[100010];
int gb(int r[],int s[],int left,int mid,int right)
{
    int i,j,k;
    i=left,j=mid+1;k=left;
    while(i<=mid&&j<=right)
    {
        if(r[i]<=r[j])
            s[k++]=r[i++];
        else
            s[k++]=r[j++];
    }
    while(i<=mid)
        s[k++]=r[i++];
    while(j<=right){
        s[k++]=r[j++];
    }
        return 0;
}
int gb_1(int r[],int s[],int left,int right)
{
    int mid,t[100010];
    if(left==right)
        s[left]=r[right];
    else{
        mid=(left+right)/2;
        gb_1(r,t,left,mid);
        gb_1(r,t,mid+1,right);
        gb(t,s,left,mid,right);
    }
    return 0;
}
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    gb_1(a,a,0,n-1);
    for(int i=0;i<n-1;i++)
        b[i]=a[i+1]-a[i];
    gb_1(b,b,0,n-2);
    printf("%d\n",b[1]);
    return 0;
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值