题目描述
Given a collection of distinct integers, return all possible permutations.
样例
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
思路分析
假设我们有了当前前 i 个元素的组合,当第 i+1个元素加入时,我们需要做的是将这个元素加入之前的每一个结果,并且放在每个结果的每个位置。
以输入[1,2,3]为例,先加入1,只有一种加法,然后加入2,[1,2]或[2,1,],两种加法;再加入3,在之前的基础上,每种都有3种加法,一共就是6种。
代码
public class Permutations { public List<List<Integer>> permute(int[] num) { List<List<Integer>> ans = new ArrayList<List<Integer>>(); if (num.length == 0) { return ans; } List<Integer> list = new ArrayList<Integer>(); list.add(num[0]); ans.add(list); for (int i = 1; i < num.length; i++) { List<List<Integer>> ans1 = new ArrayList<List<Integer>>(); for (int j = 0; j <= i; j++) { for (List<Integer> l : ans){ List<Integer> newlist = new ArrayList<Integer>(l); newlist.add(j,num[i]); //逐个位置插入 ans1.add(newlist); } } ans = ans1; } return ans; } }
结果
递归写法
public List<List<Integer>> permute(int[] nums) { List<List<Integer>> list = new ArrayList<>(); backtrack(list, new ArrayList<>(), nums); return list; } private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){ if(tempList.size() == nums.length){ list.add(new ArrayList<>(tempList)); } else{ for(int i = 0; i < nums.length; i++){ if(tempList.contains(nums[i])) continue; tempList.add(nums[i]); backtrack(list, tempList, nums); tempList.remove(tempList.size() - 1); } } }