leetcode–demo46全排列
这道题首先要画出树形图,这样便于我们了解递归结构。主要思想就是dfs+回溯算法。
class Solution1 {
public List<List<Integer>> permute(int[] nums) {
//使用一个动态数组保存所有可能的全排列
List<List<Integer>> res = new ArrayList<>();
if(nums.length==0){
return res;
}
//状态数组用于判断是否已经出现过
boolean[] used = new boolean[nums.length];
List<Integer> path = new ArrayList<>();
//使用dfs
dfs(nums,used,path,res,0);
return res;
}
private void dfs(int[] nums, boolean[] used, List<Integer> path, List<List<Integer>> res, int depth) {
//确定递归的终止条件
if(depth==nums.length){//即已完成全排列的一种情况
//将这一路径对应的列表添加到结果列表中
res.add(new ArrayList<>(path));
//返回到上一层
return;
}
for (int i=0;i<nums.length;i++){
//选择分支的结点
if (!used[i]){//如果之前未曾出现
path.add(nums[i]);//将值添加到当前路径的列表中
used[i]=true;//修改状态,使得之后不再重复使用
//进行递归
dfs(nums,used,path,res,depth+1);
//以下为回溯的部分
used[i]=false;
path.remove(path.size()-1);
}
}
}
}
实在看不懂的去看LeetCode官方题解。