leecode---46---数组,dfs---求出数组的所有组合
创建一个boolean数组去记录数组中每个数字的使用情况。
dfs的入参:最终结果,当前结果,原数组,数组boolean值。
如果当前结果长度等于数组长度记录结果。
否则遍历数组boolean值从第一个位置开始遍历,如果是false说明没有使用过,那么将这个参数存入当前数组的同时将布尔值改变成false,然后进行下一次dfs。
最后需要弹出该位置的参数,因为这个参数可以由其他参数替代。
题意
[1,2,3] have the following permutations:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
分析
1.要判断某个数字之前是否使用过,那么就必须
代码
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> item = new ArrayList<Integer>();
if(nums.length==0||nums==null)
return res;
boolean[] visited = new boolean[nums.length];
dfs(res,item,nums,visited);
return res;
}
public void dfs(List<List<Integer>> res,List<Integer> temp,int[] nums,boolean[] visited) {
//dfs终止条件
if (temp.size() == nums.length) {
res.add(new ArrayList(temp));
}
//首先这种dfs的遍历不是从某个pos的位置开始遍历,而是从头开始遍历的,因为可能前面的参数没有用过
//否则就继续下一个层,也就是添加一个数字到temp里面去
//也是从头开始遍历哪个数字用没用过,没用过就添加进去
for (int i=0;i<nums.length;i++){
if(visited[i] == false){
temp.add(nums[i]);
visited[i] = true;
dfs(res,temp,nums,visited);
temp.remove(temp.size() - 1);
visited[i] = false;
}
}
}
}