最近,小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;
}