1.全排列
1.1 题目
1.2 题解
LeetCode 力扣官方题解
1.3 代码
class Solution {
public List<List<Integer>> permute(int[] nums) {
// 创建一个空的列表 res,用于存储所有的排列结果
List<List<Integer>> res = new ArrayList<>();
// 如果输入数组 nums 的长度为 0,则直接返回结果列表(空列表)
if (nums.length == 0) {
return res;
}
// 创建一个布尔数组 used,用于记录哪些数字已经被使用。其长度与 nums 相同
boolean[] used = new boolean[nums.length];
// 创建一个双端队列 path,用于保存当前排列的数字
Deque<Integer> path = new LinkedList<>();
// 调用名为 dfs 的辅助方法,开始深度优先搜索。初始深度为 0
dfs(nums, 0, path, used, res);
// 最后返回包含所有排列结果的列表 res
return res;
}
private void dfs(int[] nums, int depth, Deque<Integer> path, boolean[] used, List<List<Integer>> res) {
// 递归终止条件
if (depth == nums.length) {
// 当前深度等于 nums 的长度时,表示当前的排列已经完成。将 path 中的当前排列添加到结果列表中
res.add(new ArrayList<>(path));
}
// 通过一个循环,遍历所有的数组元素
for (int i = 0; i < nums.length; i++) {
// 如果当前元素 nums[i] 已经在当前排列中使用,则跳过该元素,以避免重复排列
if (used[i]) {
continue;
}
// 将 nums[i] 添加到 path 的末尾,表示当前元素已被选择
path.addLast(nums[i]);
// 将 used[i] 标记为 true,表示当前元素已被使用
used[i] = true;
// 递归调用 dfs 方法,进行下一层深度的搜索
dfs(nums, depth + 1, path, used, res);
// 撤销操作,即是回溯
// 撤销上一步的选择,移除 path 中的最后一个元素
path.removeLast();
// 将 used[i] 标记为 false,表示当前元素可以被下一个排列使用
used[i] = false;
}
}
}