力扣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);
        }
    }
}
相关推荐
wuminyu16 分钟前
Java世界中StringTable源码剖析
java·linux·c语言·jvm·c++
hairenwangmiao24 分钟前
B4041 [GESP202409 四级] 区间排序
算法·排序
一个做软件开发的牛马25 分钟前
Spring Boot 自动配置原理揭秘:从 @SpringBootApplication 到手写自定义 Starter
java·后端
人道领域35 分钟前
【LeetCode刷题日记】47.全排列Ⅱ
java·开发语言·算法·leetcode
漂流瓶jz37 分钟前
UVA-1606 两亲性分子 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·向量·aoapc·算法竞赛入门经典·atan2·浮点
Navigator_Z39 分钟前
LeetCode //C - 1095. Find in Mountain Array
c语言·算法·leetcode
不会就选b1 小时前
算法日常・每日刷题--<二分查找>1
算法
是苏浙1 小时前
Java实现链表1
java·开发语言
未若君雅裁1 小时前
上传数据安全:对称加密、非对称加密、签名与重放防护
java·安全
「維他檸檬茶」1 小时前
大模型算法学习2026.6.13
学习·算法