有意思的算法题——全排列
程序员文章站
2024-03-13 08:13:03
...
题目描述
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题
public class Solution {
public List<List<Integer>> permute(int[] nums){
int len = nums.length;
List<List<Integer>> res = new ArrayList<>();
if(len == 0){
return res;
}
boolean[] used = new boolean[len];
Deque<Integer> path = new ArrayDeque<>(len);
dfs(nums, len, 0, path, used, res);
return res;
}
private void dfs(int[] nums, int len, int depth, Deque<Integer> path, boolean[] used, List<List<Integer>> res){
if(depth == len){
res.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < len; i++){
if(!used[i]){
path.addLast(nums[i]);
used[i] = true;
dfs(nums, len, depth + 1, path, used, res);
used[i] = false;
path.removeLast();
}
}
}
}
我们的任务就是遍历这颗树,记录路径上的数字,这就是所有的全排列。
我们采用深度优先遍历。
代码分析
首先创建一个res数组保存所有的全排列,创建used数组是为了查看哪些数字已经选了,哪些数字还没有选,比如当走到节点1树,你有两种选择(2或者3),你选择了2,当回溯到节点1时,这时就不能选择2了,只能选择3。path是一个栈,代表走过的路径,就是一个排列。进入递归函数,结束条件是遍历到最底层,也就是当数组长度等于树的高度。
接下来的for循环用下图来说明
这是for的逻辑,也是这段代码的核心。
上一篇: 基于java涉及父子类的异常详解
下一篇: Java爬虫 信息抓取的实现