Monday, March 8, 2010

find duplicate in array

Given an array of size N in which every number is between 1 and N, determine if there are any duplicates in it.




MY Solution:
              I first sort the array and then check if their r any adjacent elements r repeated.



#include"stdio.h"
#include"stdlib.h"
#define MAX_NUMBERS  10


void MyQuickSort(int iLow, int iHigh, int aNumbers[]);
int MySortDivision(int iLow, int iHigh, int aNumbers[]);

int MyDupCount(int aNumbers[]);
       
int main()
{
    int iCount = 0,iSumActual = 0,iSumUser = 0;
    int aNumber[MAX_NUMBERS];
    int iDupCount = 0;
    for(iCount = 0; iCount < MAX_NUMBERS; iCount++)
        scanf("%d",&aNumber[iCount]);
    MyQuickSort(0, MAX_NUMBERS-1, aNumber);
    iDupCount = MyDupCount(aNumber);
    printf("Total Number of Duplicates: %d", iDupCount);
    return 0;
}
   

int MyDupCount(int aNumbers[])
{
    int iArrayLen = 0;
    int iDupCount = 0;
    int iRepetiveCount;
    while(iArrayLen < MAX_NUMBERS)
    {
        if(aNumbers[iArrayLen] == aNumbers[iArrayLen + 1])
        {
            iDupCount++;
            iRepetiveCount =iArrayLen+1;
            while(aNumbers[iRepetiveCount++] == aNumbers[iArrayLen]);
        }
        iArrayLen++;
    }
    return iDupCount++;
}





void MyQuickSort(int iLow, int iHigh, int aNumbers[])
{
    int iPivotElementIndex = 0;
    if(iLow < iHigh)
    {
        iPivotElementIndex = MySortDivision(iLow, iHigh, aNumbers);
        MyQuickSort(iLow, iPivotElementIndex - 1 ,aNumbers);
        MyQuickSort(iPivotElementIndex + 1, iHigh, aNumbers);
    }
    return;
}


int MySortDivision(int iLow, int iHigh, int aNumbers[])
{
    int iInternalLow = iLow;
    int iInternalHigh = iHigh;
    int iPivot = aNumbers[iLow];
    int iLowValue,iHighValue;
    while(iInternalLow < iInternalHigh)
    {
        iHighValue = aNumbers[iInternalHigh];
        while(iPivot <= iHighValue)
        {
            if(iInternalHigh <= iInternalLow)
                break;
            iInternalHigh--;
            iHighValue = aNumbers[iInternalHigh];
        }
        aNumbers[iInternalLow] = iHighValue;
        iLowValue = aNumbers[iInternalLow];
        while(iPivot > iLowValue)
        {
            if(iInternalLow >= iInternalHigh)
                break;
            iInternalLow++;
            iLowValue = aNumbers[iInternalLow];
        }
        aNumbers[iInternalHigh] = iLowValue;
    }
    aNumbers[iInternalLow] = iPivot;
    return iInternalLow;
}

No comments:

counter