package com.interview.algorithms.general;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-11-6
* Time: 上午8:40
*/
public class C1_73D_UniquePermutation {
private int[] num;
private boolean[] marked;
private Integer[] current;
List<List<Integer>> result;
public List<List<Integer>> permuteUnique(int[] num) {
this.num = num;
marked = new boolean[num.length];
current = new Integer[num.length];
result = new ArrayList<>();
this.num = num;
Arrays.sort(num);
permute(0);
return result;
}
private void permute(int offset){
if(offset == num.length) {
result.add(new ArrayList<>(Arrays.asList(current)));
return;
}
for(int i = 0; i < num.length; i++){
if(marked[i]) continue;
// If in left there is an element with the same value but not used in permutation
// it means that we have case when we 1(at0) 1(at1) try to put 1(at1) before 1(0), and
// it will generate duplicates.
// so there is simple check for that case by iterating
boolean unusedDuplication = false;
int j = i - 1;
while(j >= 0 && num[j] == num[i]){
if(!marked[j]) unusedDuplication = true;
j--;
}
if(!unusedDuplication){
marked[i] = true;
current[offset] = num[i];
permute(offset + 1);
marked[i] = false;
}
}
}
}