1. 题目
读题
https://leetcode.cn/problems/permutations/description/
LeetCode 46题是一个**全排列**问题,给定一个不含重复数字的数组 nums ,返回其 **所有可能的全排列**。你可以 **按任意顺序** 返回答案。¹³
例如,输入: [1,2,3],输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]。²⁴
这是一个典型的**回溯算法**问题,需要用一个used数组记录已经选择的元素,每次从头开始搜索,不合适就退回上一步。²⁴
考查点
2. 解法
思路
首先,定义一个result列表来存储最终的结果,一个path列表来存储当前的排列,一个used数组来存储已经使用过的元素。
然后,定义一个递归函数backtracking,它接收四个参数:nums数组,used数组,path列表和result列表。
在递归函数中,首先判断是否满足递归终止条件,即path的大小是否等于nums的大小。如果是,说明找到了一个全排列,就把path的拷贝加入到result中,并返回。
如果不是,就遍历nums数组中的每个元素,如果该元素没有被使用过,就把它加入到path中,并把used数组对应位置设为true,表示已经使用过。然后递归调用backtracking函数,继续搜索下一个位置的元素。在回溯时,要把path的最后一个元素弹出,并把used数组对应位置设为false,表示未使用过。
这样,通过不断地递归和回溯,就可以遍历所有可能的全排列,并把它们存储到result中。
- 定义一个result列表来存储最终的结果,一个path列表来存储当前的排列,一个used数组来存储已经使用过的元素。
- 定义一个递归函数backtracking,它接收四个参数:nums数组,used数组,path列表和result列表。
- 在递归函数中:
- 如果path的大小等于nums的大小,说明找到了一个全排列,就把path的拷贝加入到result中,并返回。
- 否则,遍历nums数组中的每个元素:
- 如果该元素没有被使用过,就把它加入到path中,并把used数组对应位置设为true。
- 然后递归调用backtracking函数,继续搜索下一个位置的元素。
- 在回溯时,要把path的最后一个元素弹出,并把used数组对应位置设为false。
- 返回result列表作为最终答案。
具体实现
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 | class Solution { public List<List<Integer>> permute( int [] nums) { List<List<Integer>> result = new ArrayList<>(); // 存储结果 List<Integer> path = new ArrayList<>(); // 存储当前的排列 boolean [] used = new boolean [nums.length]; // 存储已经使用过的元素 backtracking(nums, used, path, result); // 递归函数 return result; } private void backtracking( int [] nums, boolean [] used, List<Integer> path, List<List<Integer>> result) { if (path.size() == nums.length) { // 如果path的大小等于nums的大小,说明找到了一个全排列 result.add( new ArrayList<>(path)); // 加入到result中 return ; } for ( int i = 0 ; i < nums.length; i++) { // 对于每个元素 if (!used[i]) { // 如果没有使用过 path.add(nums[i]); // 加入到path中 used[i] = true ; // 标记为已使用 backtracking(nums, used, path, result); // 递归调用backtracking path.remove(path.size() - 1 ); // 回溯时要把path的最后一个元素弹出 used[i] = false ; // 标记为未使用 } } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2019-04-29 Spring 框架用到的 9 个设计模式汇总!
2019-04-29 设计模式总结
2019-04-29 spring中的设计模式
2019-04-29 深入解析spring中用到的九种设计模式