https://oj.leetcode.com/problems/permutations/
http://fisherlei.blogspot.com/2012/12/leetcode-permutations.html
TODO
see subset combination, next
public class Solution { // Assumes all input numbers are unique public List<List<Integer>> permute(int[] num) { return permute_recursively(num); } //////////////////// // Solution 2: Swap Recursively: // // swap 0-0, 0-1, 0-2, 0-3, ..., 0-k // swap 1-1, 1-2, ... 1-k // swap 2-2 ... // ... // swap k-k public List<List<Integer>> permute_recursively(int[] num) { List<List<Integer>> result = new ArrayList(); perm(0, num, result); return result; } private void perm(int start, int[] num, List<List<Integer>> result) { int len = num.length; if(start >= len) { List<Integer> tmp = new ArrayList<>(num.length); for(int n : num) tmp.add(n); result.add(tmp); return; } for(int i = start ; i < len ; i ++) { swap(num, start, i); perm(start + 1, num , result); swap(num, start, i); } } private void swap(int[] A, int i, int j) { int tmp = A[i]; A[i] = A[j]; A[j] = tmp; } //////////////////// // Solution 1: Insertion: // // n = 1 // 1 // // n = 2 // 2,1 // 1,2 // // n = 3 // 3,2,1 // 2,3,1 // 2,1,3 // 3,1,2 // 1,3,2 // 1,2,3 // // 已知 n-1 集合,对每一个元素,在所有可能出插入数字n。 // // Bad point: // If the input numbers contains dups, need to use Set<Set<Integer>> to avoid dups. public List<List<Integer>> permute_insertion(int[] num) { List<List<Integer>> toReturn = new ArrayList<>(); if (num == null || num.length == 0) return toReturn; // Insert result when length = 1 toReturn.add(Collections.singletonList(num[0])); for (int i = 1 ; i < num.length ; i ++) { List<List<Integer>> newresults = new ArrayList<>(); for (List<Integer> lastr : toReturn) { for (int j = 0 ; j <= lastr.size() ; j++) { List<Integer> newr = new ArrayList<>(lastr); newr.add(j, num[i]); newresults.add(newr); } } toReturn = newresults; } return toReturn; } }
原文地址:http://7371901.blog.51cto.com/7361901/1598382