46.全排列
- 全排列
难度中等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();
}
}