解法
class Solution {
List<List<Integer>> res = new LinkedList<>();/* 主函数,输入一组不重复的数字,返回它们的全排列 */List<List<Integer>> permute(int[] nums) {
// 记录「路径」LinkedList<Integer> track = new LinkedList<>();// 「路径」中的元素会被标记为 true,避免重复使用boolean[] used = new boolean[nums.length];backtrack(nums, track, used);return res;}// 路径:记录在 track 中// 选择列表:nums 中不存在于 track 的那些元素(used[i] 为 false)// 每个路径上的结束条件:nums 中的元素全都在 track 中出现(我的理解就是一条track中出现)void backtrack(int[] nums, LinkedList<Integer> track, boolean[] used) {
// 触发结束条件if (track.size() == nums.length) {
res.add(new LinkedList(track));return;}for (int i = 0; i < nums.length; i++) {
// 排除不合法的选择if (used[i]) {
/**<extend up -200><img src="/algo/images/backtracking/6.jpg"> */// nums[i] 已经在 track 中,跳过continue;}// 做选择track.add(nums[i]);used[i] = true;// 进入下一层决策树backtrack(nums, track, used);// 取消选择track.removeLast();used[i] = false;}}
}
复杂度
- 时间复杂度:O(N!)
- 空间复杂度:
自我学习:
要记住和参考文章中的回溯算法框架。
参考:https://labuladong.gitee.io/algo/4/30/106/