Question: Given an array with n+2 elements, all elements of the array are in range 1 to n and also all elements occur only once except 2 numbers which occur twice. Find those 2 repeating numbers.
Input: arr [ ] = {6, 2, 6, 5, 2, 3, 1}
Output: 6 2
We discussed the method to find the 2 repeating element using 2 loops, but that method had a great time complexity and it was not at all an optimal solution. We can optimize it using a count array.
This solution is like using a hash table. For simplicity we can use array for storing the counts. Traverse the array once and keep track of count of all the elements in a second count array of size n. When we see an element whose count is already set, print it as a duplicate. Here is an implementation of the same.
void printRepeatingElements(int arr, int n)
{
//make a count array of size n
//and initialize all elements to 0
int *count = (int *)malloc(sizeof(int)*n);
int i;
//iterate through the array and increase the count in count array
for(i=0;i<n;i++)
{
//increase the count
count[arr[i]]++;
//if any element occurs twice, print it.
if(count[arr[i]] == 2)
printf("%d ",arr[i]);
}
}
Time Complexity:- O(n)
Space Complexity:- O(n)
Click here for an even optimized approach with less space complexity.
