当前位置: 代码迷 >> 综合 >> LeetCode46. 全排列(回溯算法)
  详细解决方案

LeetCode46. 全排列(回溯算法)

热度:84   发布时间:2023-10-26 23:29:17.0

解法

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/