package com.interview.number;
import java.util.Arrays;
/**
* e.g if src array is {1,2,5,7,8} and dest is {5,8,1,9,8}
* permute src in such a way that it is greater than dest but diff is minimal
* so here we will have {5,8,2,1,7}
*
*/
public class PermutationLargerThanGivenArray {
public int[] findBiggerNumber(int src[],int dest[]){
int result[] = new int[src.length];
boolean[] used = new boolean[src.length];
boolean r = findNumber(src, dest, result, 0, used);
if(!r){
return null;
}
return result;
}
private void sortRemaining(int src[],int result[],boolean used[],int pos){
int pos1 = pos;
for(int i=0; i < src.length; i++){
if(!used[i]){
result[pos1] = src[i];
pos1++;
}
}
Arrays.sort(result,pos,result.length);
}
private boolean findNumber(int src[],int dest[],int result[],int pos,boolean used[]){
if(pos == result.length){
return false;
}
boolean hasEqual = false;
int nextGreaterIndex = -1;
int equalIndex = -1;
int nextGreaterDiff = Integer.MAX_VALUE;
for(int i=0; i < src.length; i++){
if(used[i]){
continue;
}
if(dest[pos] == src[i]){
hasEqual = true;
equalIndex = i;
continue;
}
if(src[i] > dest[pos]){
if(src[i] - dest[pos] < nextGreaterDiff){
nextGreaterIndex = i;
nextGreaterDiff = src[i] - dest[pos];
}
}
}
//first try with equal item and see next numbers in array might find larger one.
//if it fail try next larger number
if(hasEqual){
used[equalIndex] = true;
result[pos] = src[equalIndex];
if(findNumber(src,dest,result,pos+1,used)){
return true;
}
used[equalIndex] = false;
}
if(nextGreaterIndex != -1){
used[nextGreaterIndex] = true;
result[pos] = src[nextGreaterIndex];
sortRemaining(src, result, used, pos+1);
return true;
}
return false;
}
public static void main(String args[]){
int src[] = {1,2,5,7,8};
int dest[] = {5,8,1,9,8};
PermutationLargerThanGivenArray nld = new PermutationLargerThanGivenArray();
int result[] = nld.findBiggerNumber(src, dest);
if(result != null){
for(int i=0; i < result.length; i++){
System.out.print(result[i] + " ");
}
}else{
System.out.println("Cant find bigger permutation");
}
}
}