题目
给定一个不同整数的集合,返回所有可能的排列。
示例
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
分析
由于是不同的整数则可以分别按照指针进行不断的排列即可。比如上面的例子,我们先排列以1位开始的所有可能组合,再排列2,一次类推,最后得到所有的排列组合。
实现
class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> result = new ArrayList<>(); if(null == nums || nums.length == 0) { return Collections.emptyList(); } List<Integer> permutation = new ArrayList<Integer>(); Set<Integer> set = new HashSet<>(); generate(nums, permutation, set, results); return results; } // 1. 找到所有以permutation 开头的排列 public void generate(int[] nums, List<Integer> permutation, Set<Integer> set, List<List<Integer>> results) { // 3. 递归的出口 if (permutation.size() == nums.length) { results.add(new ArrayList<Integer>(permutation)); return; } // [3] => [3,1], [3,2], [3,4] ... for (int i = 0; i < nums.length; i++) { if (set.contains(nums[i])) { continue; } permutation.add(nums[i]); set.add(nums[i]); generate(nums, permutation, set, results); set.remove(nums[i]); permutation.remove(permutation.size() - 1); } } } }