Skip to content

Instantly share code, notes, and snippets.

@Jimexist
Created September 7, 2013 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jimexist/6474223 to your computer and use it in GitHub Desktop.
Save Jimexist/6474223 to your computer and use it in GitHub Desktop.
Derangement, permutation of integer array where for any i, a[i] != i
import java.util.*;
public class Derangement {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i=0; i<4; ++i) {
list.add(i);
}
for (List<Integer> li : derangement(list)) {
System.out.println(li);
}
}
public static <T> List<List<T>> derangement(List<T> elements) {
List<List<T>> list = new ArrayList<>();
if (elements.size() == 0) {
list.add(new ArrayList<T>());
} else {
backtrack(elements, new int[elements.size()], 0, new BitSet(elements.size()), list);
}
return list;
}
private static <T> void backtrack(final List<T> elements,
final int[] buffer,
int k,
BitSet bs,
List<List<T>> result) {
if (k == elements.size()) {
List<T> range = new ArrayList<>();
for (int i : buffer) {
range.add(elements.get(i));
}
result.add(range);
} else {
for (int i=0; i<elements.size(); ++i) {
if (!bs.get(i) && i != k) {
bs.set(i);
buffer[k] = i;
backtrack(elements, buffer, k+1, bs, result);
bs.set(i, false);
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment