
46 全排列(递归)
发布日期:2021-05-07 21:50:10
浏览次数:19
分类:精选文章
本文共 2058 字,大约阅读时间需要 6 分钟。
全排列生成问题分析与解决方案
问题描述
给定一个没有重复数字的序列,要求返回其所有可能的全排列。
示例
输入:[1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
思路分析
生成全排列的方法有多种,这里使用交换元素的方法来实现。具体来说,可以通过递归的方式,在每个位置上交换当前元素与后续元素,从而生成所有可能的排列。为了避免重复,我们需要在递归回溯时恢复交换前的元素位置。
递归交换法:
- 在当前位置选择一个元素,和它后面的所有元素进行交换。
- 递归地处理下一个位置。
- 在递归返回时,恢复交换前的元素位置,以保持数组状态不变。
官方代码解析:
- 官方代码使用了Java的
Collections.swap
方法来实现元素交换。 - 通过递归调用
backtrack
方法,生成所有可能的排列。 - 在递归开始时,将数组元素添加到列表中,确保每次递归处理的是独立的状态。
代码实现
以下是两种方法的实现代码:
自写代码:
import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Solution { Listres = new ArrayList<>(); public List permute(int[] nums) { solve(nums, 0); return res; } private void solve(int[] nums, int k) { if (k == nums.length) { List list = new ArrayList<>(); for (int i = 0; i < nums.length; ++i) { list.add(nums[i]); } res.add(list); return; } for (int i = k; i < nums.length; ++i) { int t = nums[i]; nums[i] = nums[k]; nums[k] = t; solve(nums, k + 1); // 回溯 t = nums[i]; nums[i] = nums[k]; nums[k] = t; } }}
官方代码:
import java.util.*;public class Solution { public void backtrack(int n, ArrayListnums, List output, int first) { if (first == n) { output.add(new ArrayList (nums)); } for (int i = first; i < n; ++i) { Collections.swap(nums, first, i); backtrack(n, nums, output, first + 1); Collections.swap(nums, first, i); } } public List permute(int[] nums) { List output = new LinkedList<>(); ArrayList nums_lst = new ArrayList<>(); for (int num : nums) { nums_lst.add(num); } int n = nums.length; backtrack(n, nums_lst, output, 0); return output; }}
总结
通过上述方法,我们可以轻松地生成一个没有重复数字的序列的所有全排列。两种方法都利用了递归和交换元素的思想,确保了生成的全排列是唯一且完整的。选择哪种方法取决于具体的性能需求和代码风格偏好。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月23日 23时14分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
asp.net打印网页后自动关闭网页【无需插件】
2019-03-06
推荐5个漂亮的网站html源码
2019-03-06
一个人开发的html整站源码分享网站就这么上线了
2019-03-06
SQLServer 查看耗时较多的SQL语句(转)
2019-03-06
【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件
2019-03-06
元旦在家撸了两天Seata源码,你们是咋度过的呢?
2019-03-06
高并发场景下如何优化服务器的性能?
2019-03-06
数据结构与算法系列之目录
2019-03-06
【计算机网络】应用层
2019-03-06
【Markdown】公式指导手册
2019-03-06
【Maven】POM基本概念
2019-03-06
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2019-03-06
【设计模式】单例模式
2019-03-06
【SpringCloud】Hystrix熔断器
2019-03-06
【SpringCloud】Gateway新一代网关
2019-03-06
【Linux】2.3 Linux目录结构
2019-03-06
java.util.Optional学习笔记
2019-03-06
详解SpringBoot(2.3)应用制作Docker镜像(官方方案)
2019-03-06
远程触发Jenkins的Pipeline任务的并发问题处理
2019-03-06