I had an interview today which involved this very question and in order to widen my algorithmic knowledge. I am trying to see if there are any better suggestions.
I was trying to find duplicates in an array without using java.util and widen my algorithmical knowledge in regards to addressing space and time complexities.
Below is the code I produced during the technical assessment:
public static boolean isThereDuplicates(int[] A){ for (int i = 0; i < A.length; i++) for (int j = i + 1; j < A.length; j++){ if (A[i] == A[j]) return true; } return false; }
This simple algorithm looks identical to the Bubble Sort, which runs in O(N^2). Is there any other better algorithms that I could use to achieve this?
Advertisement
Answer
If the values of A are reasonably bounded (i.e. you have enough RAM) you could use the bones of the radix-sort algorithm to find a duplicate in O(n).
public static boolean containsDuplicates(int[] A) { // Create a zero-initialised array the size of the maximum allowed value in A. int[] count = new int[maximumValuePossible(A)]; for (int i = 0; i < A.length; i++) { if (count[A[i]] != 0) { // The value at A[i] is already in the histogram -> duplicate! return true; } // A[i] is not in the histogram yet. count[A[i]]++; } return false; }
Edit: To return a copy of the array with duplicates removed you could then do:
public static int[] stripped(int[] A) { int[] count = new int[maximumValuePossible(A)]; int uniques = 0; for (int i = 0; i < A.length; i++) { count[A[i]]++; if (count[A[i]] == 1) { uniques++; } } if (uniques == 0) return null; int[] retArray = new int[uniques]; int retIndex = 0; for (int i = 0; i < count.length; i++) { if (count[i] > 0) { retArray[retIndex++] = count[i]; } } return retArray; }