如何找到所有其他对中具有最大值差异的对的数量?

时间:2016-07-10 08:51:49

标签: c arrays

我计算了每对之间的差异,然后仅在该位置存储了与该元素相关的最大差异,例如数组为1 2 3,因此a [0] = 2,a [1] = 1 ,因为1的差异最大为3,差异2最大为3,现在无论我做什么操作我都会将数组大小减少1,所以现在我计算最大差值并将其放在第0个索引中,之后我运行一个循环,直到减少数组的大小并计算出这个最大值出现的次数,但这种方法花费的时间太长,有人可能会提出一些简单的逻辑。输入的形式是 没有测试用例例如2 第一个数组中没有元素 第一个数组中最大的对数 第二个数组中没有元素 第二个数组中元素的最大数量

#include <stdio.h>
#include<math.h>
int max=0;
int main()
{
    int test_no, n1,n2,i,j,a,b,count1=1,count2=1;
    scanf("%d",&test_no);
    printf("\n");
    scanf("%d",&n1);
    printf("\n");
    int arr1[n1];
    for(i=0;i<n1;i++)
    {
        scanf("%d ",&arr1[i]);
    }
    for(i=0;i<n1-1;i++)
    {
        for(j=i+1;j<=n1-1;j++)
        {
          a=abs(arr1[i]-arr1[j]);
          if(max<=a)
          max=a;
        }
        arr1[i]=max;
        max=0;
    }
    int temp;
    max=arr1[0];
    for(i=1;i<n1-1;i++)
    {
        if(max<arr1[i])
        {
            temp=max;
            max=arr1[i];
            arr1[i]=temp;
            arr1[0]=max;
        }
    }
    for(i=1;i<n1-1;i++)
    {
        if(arr1[i]==arr1[0])
        {
            count1++;
        }
    }
    printf("\n");
    scanf("%d",&n2);
    int arr2[n2];
    max=0;
    for(i=0;i<n2;i++)
    {
        scanf("%d ",&arr2[i]);
    }
    for(i=0;i<n2-1;i++)
    {
        for(j=i+1;j<=n2-1;j++)
        {
            a=abs(arr2[i]-arr2[j]);
            if(max<=a)
            max=a;
        }
        arr2[i]=max;
        max=0;
    }
    temp=0;
    max=arr2[0];
    for(i=1;i<n2-1;i++)
    {
        if(max<arr2[i])
        {
            temp=max;
            max=arr2[i];
            arr2[i]=temp;
            arr2[0]=max;
        }
    }
    for(i=1;i<n2-1;i++)
    {
        if(arr2[i]==arr2[0])
        {
            count2++;
        }
    }
    printf("%d \n",count1);
    printf("%d",count2);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

对数组进行排序(这需要n log n时间)。

现在最大差异显然是最后一个元素的值减去第一个元素的值。

要获得相同的差异,您需要相同的第一个元素和相同的结束元素 * ,这样您只需要计算有多少元素等于首先(比如4),有多少元素等于最后一个(比如说3),并取两个值中较小的一个(这里是3)。

size_t i;
for (i = 1; i < arrayLength/2; i++) {
    if ((sortedArray[i] != sortedArray[0])
        ||
        (sortedArray[n-1-i] != sortedArray[n-1])) {
        break;
    }
}
// i is now the number you need.

要在C中对数组进行排序,您还可以使用现成的库函数。

或者您可以在O(N)时间内完成此操作,只需扫描数组:

int minVal = INT_MIN;
int maxVal = INT_MAX;
int cntMin = 0;
int cntMax = 0;
for (i = 0; i < n; i++) {
    if (arr[i] < minVal) {
        minVal = arr[i];
    }
    if (arr[i] > maxVal) {
        maxVal = arr[i];
    }
    if (arr[i] == minVal) { cntMin++; }
    if (arr[i] == maxVal) { cntMax++; }
}
if (minVal == maxVal) {
    return n/2;
}
return min(cntMin, cntMax);

示例:

0 0 0 0 1 2 3 4 5 6 6 6

最大差异为6,可以找到3次。

0 1 2 3 4 5 6 6 6

最大差异仍然是6,并且只能找到一次。

如果你想计算所有可能的对(例如在[0 1 ,0 2 ,6 1 ,6 2 ,6 3 ]你想拥有(0 1 ,6 1 )...... (0 2 ,6 3 )),即使你关于删除元素的注释似乎另有说明,那么代替返回cntMin的最小值和cntMax,只需返回他们的产品。如果它们相等,则返回N *(N-1))。

-

(*)与两个不同的数字得到相同的差异,其中一个必须小于初始范围的最小值或大于最大值,这是矛盾的。例如。要获得6而不是6和0,你需要7和1,或5和-1。但是7超过6,-1小于0.因此,一旦包含7或-1,你的数组的最大差异不再是6。

答案 1 :(得分:1)

您需要做的就是计算阵列中最小和最大数量的次数。完成后,通过简单的乘法找到对的数量。

这可以这样做:

#include <stdio.h>
#include <limits.h>

#define N 7

int main(void) {
    int arr[N] = {1, 2, 1, 4, 1, 5, 5};
    int max = INT_MIN;
    int min = INT_MAX;
    int i;
    int countmax = 0;
    int countmin = 0;

    for (i=0; i < N; ++i)
    {
        if (arr[i] > max)
        {
            // Found new max value --> reset counter to 1
            countmax = 1;
            max = arr[i];
        }
        else if (arr[i] == max)
        {
            // Found same max value --> increment counter
            countmax++;
        }
        if (arr[i] < min)
        {
            countmin = 1;
            min = arr[i];
        }
        else if (arr[i] == min)
        {
            countmin++;
        }
    }

    if (max == min)
    {
        // Special case: All elements are the same
        printf("%d pairs with difference 0 found\n", N*(N-1)/2);
    else
    {
        printf("%d pairs with difference %d found\n", countmin * countmax, abs(max-min));
    }
    return 0;
}

输出:

6 pairs with difference 4 found