Saturday, January 14, 2012

Given an int array which might contain duplicates, find if it is a sequence.


Given an int array which might contain duplicates, find if it is a sequence. 
Eg. {45,50,47,46,49,48}
is a sequence 45, 46,47,48,49,50
Sorting is an obvious solution. Can this be done in O(n) time and O(1) space


Approach:
Example array: A = {4, 1, 3, 3, 2}
1. get the min and max.
min=1 and max=4
2. if (max - min) > A.length then "its NOT a sequence".
3. else for each element in A[i] do the following:
a. calculate A[i] - min till A[i]-min=i;
i=0; 4 - 1 = 3, swap A[0] and A[3]
Now we have A = {3, 1, 3, 4, 2}
Again, 
i=0; 3 - 1 = 2, now A[0] and A[2] are same so swap A[0] and A[length-1] and put A[length] = infinite.
A = {2, 1, 3, 4, INF}
Again,
i=0; 2 - 1 = 1, swap A[0] and A[1], 
A = {1, 2, 3, 4, INF}
i=1; 2 - 1 = 1 (which is same as i)
similarlty for i=2, i=3
finally we have A as,
A = {1, 2, 3, 4, INF}


Code output: 

Printing Original Array ...
45 50 47 45 50 46 49 48 49 
MIN:45  MAX:50
Final Array ... 
45 46 47 48 49 50 2147483647 2147483647 2147483647 
Is Sequence: true

**Integer.MAX_VALUE (
2147483647 ) 
denotes INFINITE in the array values.

1 comment:

  1. What is the proof that this is O(n)? It seems to be O(n^2)?

    ReplyDelete