小L的难题 (15分)

题目描述

最近,小L遇到了一道难题,请你帮帮他。给出n个数,请找出这个序列的任意两个不同的数第二小的差值。a​i和 a​j 的差值定义为∣a​i​​ −a​j∣,即两个数差的绝对值,其中i和j互不相同。(第二小即从小到大排序之后的第二个数字)

输入格式:

第一行为一个正整数n (3≤n≤10​5),代表数组的长度。接下来一行,共n个整数a​i(−10​9≤a​i ≤10^​9).

输出格式:

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

输入样例1:

6
11 4 7 1 16 2

输出样例1:

2

输入样例2:

6
10 1 2 4 15 6

输出样例2:

2

源代码

#include <stdio.h>  
void p1(int a[],int n);
void p2(int a[],int n,int q,int w);
int p4(int a[],int q,int w);
int main()
{
    
    
    int n,place,i,j;
    scanf("%d",&n);
    getchar();    
    int arr[n];
    for(i=0;i<n;i++)
        scanf("%d",&arr[i]);
    p1(arr,n);
    int p[n-1];
    for(i=0;i<n-2;i++)         //最后一个i的元素值是 n-3
    {
    
    
        p[i]=arr[i+1]-arr[i];
    }
    p1(p,n-2);      //i最后是n-3  因此总数是n-2
    printf("%d",p[1]);
    return 0;
}
void p1(int a[],int n)
{
    
    
    p2(a,n,0,n-1);
}
void p2(int a[],int n,int q,int w)
{
    
    
    int p3;
    if(q<w)
    {
    
    
        p3=p4(a,q,w);
        p2(a,n,q,p3-1);
        p2(a,n,p3+1,w);
    }
}
int p4(int a[],int q,int w)
{
    
    
    int t,p3;
    p3=a[q];
    t=a[q];
    while(q<w)
    {
    
    
        while(q<w&&a[w]>=p3)
            w--;
        if(q<w)
        {
    
    
            a[q]=a[w];
            q++;
        }
        while(q<w&&a[q]<=p3)
            q++;
        if(q<w)
        {
    
    
            a[w]=a[q];
        }
        a[q]=t;
    }
    return q; 
}

猜你喜欢

转载自blog.csdn.net/weixin_49930465/article/details/113177540