See More

public class Solution { public ArrayList> permute(int[] num) { ArrayList> result = new ArrayList>(); Arrays.sort(num); do { ArrayList list = new ArrayList(); for (int i : num) list.add(i); result.add(list); } while (nextPermutation(num)); return result; } private boolean nextPermutation(int[] num) { int n = num.length; int descStart = 0; for (int i = n - 1; i > 0; i--) if (num[i] > num[i - 1]) { descStart = i; break; } if (descStart == 0) // there is no bigger number return false; for (int i = n - 1; i >= descStart; i--) if (num[i] > num[descStart - 1]){ swap(num, i, descStart - 1); break; } reverse(num, descStart, n - 1); return true; } private void reverse(int[] n, int s, int e) { for (; s < e; s++, e--) swap(n, s, e); } private void swap(int[] n, int i, int j) { int tmp = n[i]; n[i] = n[j]; n[j] = tmp; } }