力扣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);
        }
    }
}
相关推荐
深蓝学院几秒前
机器人学习算法五大体系详解:模仿、强化、多模态、持续学习……
算法·机器人
2401_8582861121 分钟前
OS82.【Linux】设计线程池
java·linux·运维·服务器·开发语言·算法·线程池
数据知道27 分钟前
IDOR 不安全的直接对象引用:API 越权实战检测
java·开发语言·网络·安全·网络安全
堕落年代33 分钟前
Ollama CPU 推理大提示词优化实测报告(细致化数据版)
java·后端·spring
Epiphany.5561 小时前
找到所有好字符串(记忆化搜索+KMP)(里面含KMP模板,用来入门)
算法
KobeSacre1 小时前
ForkJoinPool 源码
java
坚持编程的菜鸟1 小时前
模拟实现strncpy
c语言·算法·模拟实现strncpy
wear工程师1 小时前
Kafka 消费者心跳正常,为什么还会被踢出组?拆清 max.poll.interval.ms
java·kafka
SemiTris1 小时前
为什么 C/C++ 不走 Java 式的虚拟机跨平台路线?
java·程序员
weixin_440784112 小时前
【IntentSeivice实现原理】
android·java·开发语言·intentservice