46. 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[ [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ]
思路
这题目很熟悉吧,小学数学,这跟昨天写的leetcode39题很像,而且比39题容易了许多,同样的这种设计到列举全部组合的问题可以画树来解决:
可以看到,舍弃的条件是:
1、搜索长度已经达到树的深度。
2、搜索过程中如果有重复。
那么自然就是套用我们的dfs模板就行了
void dfs(int step)
{
if(满足终止搜索条件)
{
终止搜索,记录数据;
return;
}
尝试每一种搜索可能
{
if(不满足继续搜索的条件)
{
跳过这一种搜索可能;
}
记录搜索数据;
继续下一步dfs(step+1);
恢复初始状态(回溯的时候要用到);
}
}
实现代码
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int len = nums.length;
dfs(0,nums,len,new ArrayDeque<>(),res);
return res;
}
private void dfs(int number,int[] nums,int len,Deque<Integer> path,List<List<Integer>> res)
{
if(number >= len)//搜索次数达到树的深度
{
res.add(new ArrayList<>(path));//记录搜索结果
return;//终止继续搜索
}
for(int i = 0; i < len; i++)//尝试所有可能
{
if(path.contains(nums[i]))//舍弃搜索过程中有重复的情况
{
continue;
}
path.addLast(nums[i]);//记录搜索数据
number++;//记录搜索数据
dfs(number,nums,len,path,res);//下一步dfs
path.removeLast();//恢复回溯点状态
number--;//回复回溯点状态
}
}
巩固下学习的dfs咯,但是这道题目用这种方法效率是很低的。。。待优化