在数组中查找对

时间:2017-10-02 14:27:23

标签: c

所以我要做的是创建一个代码来查找数组中的数字对。当存在一对数字时,下面的代码可以很好地工作。

docker run -v /path/to/dir

我想让它在有3个相同元素的情况下工作。 例如,arr [5] = 1,1,1,2,2 它应该返回2对(1,1和2,2并留下额外的1)但它返回4对而不是我的代码!

感谢。

3 个答案:

答案 0 :(得分:0)

在这里,您将每个元素逐一与每个其他元素进行比较,这是您获得答案的原因。

要计算三个或三个以上的对,一种方法可能是对数组进行排序,然后计算元素发生的次数,如果频率大于2,则意味着它形成一对。 这是修改后的代码:

#include<stdio.h>
main()
{
    int arr[10], i, j, pairs = 0,count=0,prev_element=0;
    int n;
    scanf("%d", &n);
    for(i = 0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }

    // You need to sort the array here.

    prev_element = arr[0];
    count=1;
    for(i = 1; i<n; i++)
    {
        if(prev_element==arr[i])
        {
            count++;
        }
        else
        {
            if(count>=2)
                pairs+=count/2;
            else
            {
                prev_element=arr[i];
                count=1;
            }
        }
    }
    printf("%d", pairs);
}

这也将减少代码的时间复杂度。以前,时间复杂度为O(n2),但现在它也将变为O(n)。

这里,首先计算每个元素出现的次数,如果出现的次数大于2,则元素将形成一对,否则不会。

答案 1 :(得分:0)

您必须跟踪比较和计算的对。否则,这些对可以被计数多次。

以下代码正常运行。谢谢。

#include<stdio.h>
main()
{
    int arr[10], check[10], i, j, pairs = 0;
    int n;
    scanf("%d", &n);
    for(i = 0; i<n; i++)
    {
        scanf("%d", &arr[i]);
        check[i]    =   0;
    }
    for(i = 0; i<n; i++)
    {
        for(j = i+1; j<n; j++)
        {
            if(arr[i] == arr[j] && check[j] ==  0   &&  check[i]    ==  0)
            {
                pairs++;
                check[j]    =   1;
                check[i]    =   1;
            }
        }
    }
    printf("%d", pairs);

}

答案 2 :(得分:0)

#include<stdio.h>
main()
{
    int arr[10], i, j, pairs = 0;
    int n;
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    bubbleSort(arr,n);

    for(i = 0; i < n-1; i++)
    {
        if(arr[i] == arr[i+1])
        {
            pairs++;
            /*Skip the paired index*/
            i++;
        }
    }
    printf("%d", pairs);
}