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;
            }
        }
    }
}
posted @ 2018-05-03 16:09  buptyuhanwen  阅读(106)  评论(0编辑  收藏  举报