46. Permutations

Given a collection of distinct 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],
  [3,2,1]
]
本题采用回溯法,回溯法的特点是可以系统地搜索一个问题的所有解或者一个解,本问题是搜索所有解。回溯法利用的是dfs方法解决,回溯法有个剪枝函数的说法,剪枝函数是除掉不符合条件的解。剪枝函数包括两个函数,一个是约束函数一个是限界函数,约束函数是指,在进行dfs的过程中除去不符合条件的当前解以及以当前解为根结点的子树,而限界函数指的是除去不符合最优解的解空间。本题中,不包含最优解的情况,约束函数是
看链表中是否包含该数组元素,代码如下:
 1 public class Solution {
 2     public List<List<Integer>> permute(int[] nums) {
 3         List<List<Integer>> res = new ArrayList<>();
 4         backtracking(res,new ArrayList<Integer>(),nums);
 5         return res;
 6     }
 7     public void backtracking(List<List<Integer>> res,List<Integer> list,int[] nums){
 8         if(list.size()==nums.length){
 9             res.add(new ArrayList<Integer>(list));
10         }else{
11             for(int i=0;i<nums.length;i++){
12                 if(list.contains(nums[i])) continue;
13                 list.add(nums[i]);
14                 backtracking(res,list,nums);
15                 list.remove(list.size()-1);
16             }
17         }
18     }
19 }

 


 
posted @ 2017-02-10 14:55  CodesKiller  阅读(130)  评论(0编辑  收藏  举报