45. Permutations
Given a collection of numbers, return all possible permutations.
For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
---
参考cc150 9.5
O(N!) N factorial
---
1. Interation
public class Solution { public ArrayList<ArrayList<Integer>> permute(int[] num) { ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>(); rst.add(new ArrayList<Integer>()); for(int i=0;i<num.length;i++){ ArrayList<ArrayList<Integer>> cur = new ArrayList<ArrayList<Integer>>(); // every sublist for(ArrayList<Integer> sublist:rst){ for(int j=0;j<=sublist.size();j++){ // copy ArrayList<Integer> newlist= new ArrayList<Integer>(sublist); // insert newlist.add(j,num[i]); // add to list cur.add(newlist); } } //update rst, remove the old, add the new rst = new ArrayList<ArrayList<Integer>>(cur); } return rst; } }
2. Recursive
public class Solution { public ArrayList<ArrayList<Integer>> permute(int[] num) { if(num == null) return null; return helper(num, num.length-1); } private ArrayList<ArrayList<Integer>> helper(int[] num, int index){ ArrayList<ArrayList<Integer>> rst; if(index == -1){// base case rst = new ArrayList<ArrayList<Integer>>(); rst.add(new ArrayList<Integer>()); return rst; } rst = helper(num, index-1); int item = num[index]; ArrayList<ArrayList<Integer>> newRst = new ArrayList<ArrayList<Integer>>(); for(ArrayList<Integer> list : rst){ for(int i=0; i<=list.size(); i++){ ArrayList<Integer> newlist = new ArrayList<Integer>(list); newlist.add(i, item); newRst.add(newlist); } } return newRst; } }
3. recursive另一种思路
public class Solution { public ArrayList<ArrayList<Integer>> permute(int[] num) { ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> tmp = new ArrayList<Integer>(); int n = num.length; boolean[] visited = new boolean[n]; helper(res, tmp, num, visited); return res; } private void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> tmp, int[] num, boolean[] visited){ if(tmp.size() == num.length){ //Done, add to rst res.add(new ArrayList<Integer>(tmp)); return; } for(int i=0; i<num.length; i++){ if(!visited[i]){ tmp.add(num[i]); visited[i] = true; helper(res, tmp, num, visited); visited[i] = false; tmp.remove(tmp.size()-1); } } } }
浙公网安备 33010602011771号