package com.interview.array;
import java.util.Arrays;
/**
* Date 12/30/2015
*
* Given an array of size n where elements are in range 0 to n-1. Rearrange elements of array
* such that if arr[i] = j then arr[j] becomes i.
*
* Time complexity O(n)
* Space complexity O(1)
*
* http://www.geeksforgeeks.org/rearrange-array-arrj-becomes-arri-j/
*/
public class RearrangeArrayPerIndex {
public void rearrange(int input[]) {
for (int i = 0; i < input.length; i++) {
input[i]++;
}
for (int i = 0; i < input.length; i++) {
if (input[i] > 0) {
rearrangeUtil(input, i);
}
}
for (int i = 0; i < input.length; i++) {
input[i] = -input[i] - 1;
}
}
private void rearrangeUtil(int input[], int start) {
int i = start + 1;
int v = input[start];
while (v > 0) {
int t = input[v - 1];
input[v - 1] = -i;
i = v;
v = t;
}
}
public static void main(String args[]) {
RearrangeArrayPerIndex rai = new RearrangeArrayPerIndex();
int input[] = {1, 2, 0, 5, 3, 4};
rai.rearrange(input);
Arrays.stream(input).forEach(i -> System.out.print(i + " "));
}
}