我是靠谱客的博主 贤惠烤鸡,最近开发中收集的这篇文章主要介绍LeetCode46. 全排列(Java)1 题目描述2 算法设计3 代码实现4 测试结果,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
1 题目描述
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]
输出:[[1]]
来源:力扣(LeetCode)
链接:46. 全排列
2 算法设计
本题要求出数组元素所有的全排列,显然当数组元素较少时可以用for循环嵌套得出排列,但是当数组元素较多时这种方法是无法解决问题的,所以我们考虑用回溯来求解所有元素的全排列。
搜索过程如上图所示,结果集就是该搜索树的各个叶子结点,当同一分支上保存的结果集长度为数组长度时结束,收集叶子节点上的结果即可。
3 代码实现
public class Permute {
//res用于收集最后得到的结果集
List<List<Integer>> res = new ArrayList<>();
//path用于保存单个组合结果
LinkedList<Integer> path = new LinkedList<>();
//used用于标识同一分支上该元素是否是被使用过
boolean[] used;
public List<List<Integer>> permute(int[] nums) {
used = new boolean[nums.length];
Arrays.fill(used,false);
backTracking(nums);
return res;
}
public void backTracking(int[] nums){
//当path的长度为数组长度时,终止递归
if (path.size() == nums.length){
res.add(new ArrayList<>(path));
return;
}
for (int i = 0;i < nums.length;i++){
//used[i]为true表示在该递归分支上位置i上的元素被使用过
if (used[i] == true){
continue;
}
path.add(nums[i]);
used[i]=true;
//向下递归搜索
backTracking(nums);
used[i]=false;
//回溯
path.removeLast();
}
}
}
4 测试结果
最后
以上就是贤惠烤鸡为你收集整理的LeetCode46. 全排列(Java)1 题目描述2 算法设计3 代码实现4 测试结果的全部内容,希望文章能够帮你解决LeetCode46. 全排列(Java)1 题目描述2 算法设计3 代码实现4 测试结果所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复