力扣HOT100 - 46. 全排列

解题思路:

回溯

假设给定数组nums为1, 2, 3,首先将其转换为List<Integer>类型的output为1, 2, 3

在backtrack方法中,初始时first为0,所以进入第一个for循环,交换output中第一个元素和自身,然后递归调用backtrack方法,此时first为1,再次进入for循环,交换output中第二个元素(即2)和自身。这样得到的output为1, 2, 3,添加到结果集中。

接着回到第一个for循环,再次交换output中第一个元素和自身,此时成为2, 1, 3,再次递归调用backtrack方法,得到的output为2, 1, 3,添加到结果集中。

依次类推,通过不断交换元素的位置和递归调用backtrack方法,可以生成所有可能的排列组合。最终得到的结果为\[1, 2, 3, 2, 1, 3, 3, 1, 2, 1, 3, 2, 2, 3, 1, 3, 2, 1],即给定数组1, 2, 3的全排列结果。

java 复制代码
class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        List<Integer> output = new ArrayList<>();
        for (int num : nums) {
            output.add(num);
        }

        int n = nums.length;
        backtrack(n, output, res, 0);
        return res;
    }

    public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) {
        if (first == n)
            res.add(new ArrayList<Integer>(output));
        for (int i = first; i < n; i++) {
            Collections.swap(output, first, i);
            backtrack(n, output, res, first + 1);
            Collections.swap(output, first, i);
        }
    }
}
相关推荐
Keven_115 小时前
算法札记:图的存储方式
算法·图论
KINGSEA_1685 小时前
AgentScope Java 2.0 架构解析
java
斯文的八宝粥5 小时前
SERL:让真机强化学习从“难用”走向“可复现”的强化学习框架 ----(4)算法篇(DrQ vs VICE)
算法
yangdaxiageo5 小时前
算法时代的“心智置顶“:《功夫女足》如何构建GEO正向飞轮
人工智能·科技·算法·aigc
折哥的程序人生 · 物流技术专研5 小时前
Java 23 种设计模式:从踩坑到精通 | 备忘录模式 —— 快照与撤销,给对象装一个“后悔药”
java·设计模式·备忘录模式·行为型模式·java设计模式·从踩坑到精通·撤销重做
ysa0510305 小时前
【板子】欧拉序
c++·笔记·算法·深度优先·图论
ikun_文5 小时前
Java里面异常Exception体系知识点
java
不负岁月无痕5 小时前
STL -- C++ 红黑树封装 Map 和 Set
java·c语言·开发语言·c++·面试
大耳朵糊涂5 小时前
链表的基础操作(二)
算法
小园子的小菜5 小时前
Java核心基础:反射与泛型底层原理及实战用法详解
java·开发语言