目录
Problem: [46. 全排列](https://leetcode.cn/problems/permutations/description/)
Problem: [46. 全排列](https://leetcode.cn/problems/permutations/description/)
思路
深度优先搜索
解题过程
1. 首先需要判断我们的目标数组的元素里的数字是否被使用,所以创建一个布尔类型的数组进行判别。
2. 然后针对我们最后返回的答案数组,先针对里面集合里面的子元素(排列结果数组队列)。
3. 通过判断是否达成所有数字是否被使用——全部使用,得到一组结果,直接加入到答案数组(res)中;没有就逐位加入到排列结果数组里(str),进入下一轮检索
4. 遍历到最后一个数字时,需要回溯到上一步——以便得到新的排列结果数组。
Code
class Solution {
//答案数组
List<List<Integer>> res = new ArrayList();
boolean st[];//监测数字是否被加入
List<Integer> str = new ArrayList();//排列结果数组
public List<List<Integer>> permute(int[] nums) {
int n = nums.length;
st = new boolean[n];
dfs(0,nums);
return res;
}
void dfs(int k,int nums[])//k:数组的下标
{
//说明所有数字已经被使用,得到一种计算结果
if(k == nums.length){
res.add(new ArrayList(str));
return;
}
//否则 遍历数组->把元素添加到排列结果数组中
for(int i = 0;i < nums.length; i++){
if(!st[i]){
st[i] = true;
str.add(nums[i]);
dfs(k + 1,nums);//进入到下一轮检索
//然后找到新一轮分支
st[i] = false;
str.remove(str.size() - 1);//把最后一个元素删去
}
}
}
}