考虑这样一个问题:它要找出n个数字构成的一个数组中两个最接近数的距离(两个数x和y之间的距离定义为|x-y|)
输入描述
输入数据第一行包含一个整数n [2,100 000],表示数的个数。
第二行包含以空格隔开的n个整数,(每个整数的范围为[-100 000,100 000]), 表示这个数组。
输出描述
输出一个数字,表示数组中两个最接近数的距离。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 153600KB | 0 |
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void merge(int b[],int n1,int c[],int n2,int a[],int n)
{
int i=0,j=0,k=0,u;
while(i<n1&&j<n2)
{
if(b[i]<=c[j])
{
a[k]=b[i];
i++;
}
else
{
a[k]=c[j];
j++;
}
k++;
}
if(i==n1)
{
for(u=k;u<n;u++,j++) a[u]=c[j];
}
else
{
for(u=k;u<n;u++,i++) a[u]=b[i];
}
}
void mergesort(int a[],int n)
{
int i;
int n1,n2;
n1=floor((float)n/2);
n2=ceil((float)n/2);
if(n>1)
{
int b[n1],c[n2];
for(i=0;i<n1;i++) b[i]=a[i];
for(i=0;i<n2;i++) c[i]=a[i+n1];
mergesort(b,n1);
mergesort(c,n2);
merge(b,n1,c,n2,a,n);
}
}
int main(){
int n;
scanf("%d",&n);
int a[n],d[n-1],i;
for(i=0;i<n;i++) scanf("%d",&a[i]);
mergesort(a,n);
d[0]=a[1]-a[0];
int min=d[0],temp;
if(n>2)
{
for(i=1;i<n-1;i++)
{
d[i]=a[i+1]-a[i];
if(d[i]<min) min=d[i];
}
}
printf("%d\n",min);
}