【每日一题-leetcode】46.全排列

46.全排列

  1. 全排列

难度中等680

给定一个** 没有重复** 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

回溯算法:

 回溯算法框架
    	for 选择 in 选择列表:
        	# 做选择
        	将该选择从选择列表移除
        	路径.add(选择)
        	backtrack(路径, 选择列表)
        	# 撤销选择
        	路径.remove(选择)
        	将该选择再加入选择列表
        
    回溯算法是暴力求解,一般复杂度比较高。而动态规划存在重叠子问题 可以优化。
//回溯算法
List<List<Integer>> result = new ArrayList<>();

public List<List<Integer>> permute(int[] nums) {
    if(nums == null || nums.length == 0)    return null;
    permute(nums,new LinkedList<Integer>());
    return result;
}

public void permute(int [] nums,LinkedList<Integer> track){
    //1.终止条件
    if(nums.length == track.size()){
        result.add(new LinkedList(track)); //结果集添加
        return;
    }
    for(int i=0;i<nums.length;i++){
        //2.排除不合法的选项 
        if(track.contains(nums[i]))   continue;
        //3.做选择
        track.add(nums[i]);
        //4.进入下层决策树
        permute(nums,track);
        //5.撤销选择
        track.removeLast();
    }
}
原文地址:https://www.cnblogs.com/qxlxi/p/12860619.html