Given an array a[] of size N which contains elements from 0 to N-1, you need to find all the elements occurring more than once in the given array.
Example 1:
Input:
N = 4
a[] = {0,3,1,2}
Output: -1
Explanation: N=4 and all elements from 0
to (N-1 = 3) are present in the given
array. Therefore output is -1.
Example 2:
Input:
N = 5
a[] = {2,3,1,2,3}
Output: 2 3
Explanation: 2 and 3 occur more than once
in the given array.
Your Task:
Complete the function duplicates() which takes array a[] and n as input as parameters and returns a list of elements that occur more than once in the given array in sorted manner. If no such element is found, return list containing [-1].
Expected Time Complexity: O(n).
Expected Auxiliary Space: O(n).
Note : The extra space is only for the array to be returned.
Try and perform all operation withing the provided array.
Constraints:
1 <= N <= 105
0 <= A[i] <= N-1, for each valid i
The negation of zero doesn't change anything. Some repetitions will be impossible to follow due to the presence of zero. So this technique will not work.
Increment and divide by `n`
Logic
For every number in the array
Use it as an index
Increment the value at that index by n
The number that repeats once will make that index incremet by n only once.
But the number that repeates 2 times will increment that index twice and so on.
Scan the array again
Try dividing each value by n
Every numeber that has a quotient more than 1 has been incremented more than once
This implies that the number appeared more than once.
Insert this value into res
return res
Code
vector<int> duplicates(int arr[], int n) {
for(int i = 0; i < n; i++)
arr[arr[i] % n] += n;
vector<int> res;
for(int i = 0; i < n; i++)
if(arr[i] / n > 1)
res.push_back(i);
if(res.empty())
res.push_back(-1);
return res;
}
Complexity
Drawbacks: Modifies the given array
Time Complexity: O(n)
Space Complexity: O(n)
If it has been incremented by n only once, then the quotient will be [1,2)
If it has been incremented twice then the quotient will be [2,3) and so on.