Constraints :
- O(1) space
- O(n) Time
It is not a homework question just a interesting question I came across.
Here are some solutions I could think of but nothing that does it in given constraints.
Method 1
*With O(n) memory *
- Divide the array in two parts recursively. ( keep dividing till the size <=2 for each sub problem )
- Sort each sub problem with array first and numbers at end.
- Merge the sub problem arrays
Method 2
In O(n log n) time
- Sort the array based Lexicographical order it becomes 1234abcd
- Reverse both halves of array 4321dcba
- Reverse the whole string abcd1234
Method 3
If range of numbers was defined
Also if the case was that numbers are in a specific range then I can initialize a int say track= 0; And set the appropriate bit when I come across a number in array eg (1 << a[2] ) . 1. Swap alphabets to first half of array 2. Mark numbers in track variable 3. later use track to fill in second half of array.
Method 4 We can use Method 3 with HashMap if we want to remove the constraint of range of integers but then it will need more memory.
Cannot think of a better way to solve the generic problem in O(1) time and O(n) space.
Generic Problem here refers to:
Given a sequence x1y1x2y2x3y3....xnyn where x1 , x2 are alphabets x1 < x2 <.... < xn and y1y2...yn are integers . y1 < y2 <.... < yn Arrange the output as x1x2...xny1y2...yn
Any suggestions ?