• LeetCode算法心得——全排列(回溯型排列)


    大家好,我是晴天学长,排列型的回溯,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪


    1) .全排列

    在这里插入图片描述


    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

    示例 1:

    输入:nums = [1,2,3]
    输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
    示例 2:

    输入:nums = [0,1]
    输出:[[0,1],[1,0]]
    示例 3:

    输入:nums = [1]
    输出:[[1]]

    提示:

    1 <= nums.length <= 6
    -10 <= nums[i] <= 10
    nums 中的所有整数 互不相同


    2) .算法思路

    全排列
    1.建立boolean数组去标记
    2.用合适的数组去存答案
    3.注意回溯的时候,参数是否变回了以前的样子。


    3) .算法步骤

    1.创建一个整数数组nums,作为全排列的输入。
    2.创建一个二维列表ans,用于存储所有的全排列结果。
    3.创建一个列表path,用于存储当前的排列路径。
    4.调用permute方法,将nums作为参数传入。
    5.在permute方法中,创建一个布尔数组st,用于标记数组nums中的元素是否已经被访问过。
    6.初始化路径列表path为空。
    7.调用dfs方法,传入初始长度0、布尔数组st和路径列表path。
    8.在dfs方法中,判断如果当前路径的长度等于数组nums的长度,即已经找到了一个全排列:
    a. 将当前路径path的副本添加到结果列表ans中。
    b. 返回。
    遍历数组nums的每个元素:
    a. 如果当前元素未被访问:
    (1)将当前元素添加到路径列表path中。
    (2)将当前元素标记为已访问。
    (3)递归调用dfs方法,传入长度加1、更新后的布尔数组st和路径列表path。
    (4)将当前元素标记为未访问,以便后续的回溯。
    (5)从路径列表path中移除最后一个元素,恢复路径状态。
    c.返回最终的结果列表ans。


    4).代码示例

    class Solution {
            private int[] nums;
            //方便插入
            List<List<Integer>> ans = new LinkedList<>();
            List<Integer> path;
    
            public List<List<Integer>> permute(int[] nums) {
                this.nums = nums;//替换成全局变量。这个类中。
                boolean[] st = new boolean[nums.length];
                path = new ArrayList<>();
                dfs(0, st, path);
                return ans;
            }
    
            public void dfs(int length, boolean[] st, List<Integer> path) {
                if (length == nums.length) {
                    ans.add(new ArrayList<>(path));
                    return;
                }
                for (int i = 0; i < nums.length; i++) {
                    if (!st[i]) {
                        path.add(nums[i]);
                        st[i] = true;
                        dfs(length + 1, st, path);
                        st[i]=false;
                        path.remove(path.size()-1);
                    }
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    5).总结

    • 正确的排列回溯。

    试题链接:

  • 相关阅读:
    算法刷题日志——贪心
    漫谈ERP和MES数据打通
    idea VCS配置多个远程仓库
    全栈开发性能优化基础第七单元日考技能测
    RabbitMQ入门
    最近发现齐博x1火车头发布信息异常
    springboot web 05 springboot通过@ConfigurationProperties注解springboot获取自定义配置
    产品经历、运营人员必看:高效产品帮助文档撰写指南
    2.2 Pthreads是什么
    Nginx常用操作命令
  • 原文地址:https://blog.csdn.net/weixin_56715699/article/details/134339461