子集(LeetCode)

思路:运用回溯的思想,每一层都有两个选择,选择该元素或者不选该元素,不选的话,直接进入下一层,选择的话,就将该元素放入list后,进入下一层,但是为了保证不选择该元素的分支存在,需要从list中remove掉该元素。继续进行递归调用。最后当index的值等于数组的长度时,停止递归。将list装入res中。整个递归过程就是一棵二叉树。

public class Subset {
    
    
    public List<List<Integer>> subsets(int[] nums) {
    
    
        List<List<Integer>> ans=new ArrayList<>();
        if (nums.length==0){
    
    
            return ans;
        }
        ArrayList<Integer> list=new ArrayList<>();
        dfs(ans,list,nums,0);
        return ans;
    }
    private void dfs(List<List<Integer>> res, List<Integer> temp, int[] nums, int index) {
    
    
        if (index==nums.length){
    
    
            res.add(new ArrayList(temp));
            return;
        }
        //不加入当前层的元素直接继续递归;
        dfs(res,temp,nums,index+1);
        temp.add(nums[index]);//加入当前层的数
        dfs(res,temp,nums,index+1);
        temp.remove(temp.size()-1);
    }

    public static void main(String[] args) {
    
    
        Subset subset=new Subset();
        int [] list=new int[3];
        for (int i=0;i<3;i++){
    
    
            list[i]=i+1;
        }
       System.out.println(subset.subsets(list));
    }
}

猜你喜欢

转载自blog.csdn.net/yang12332123321/article/details/117132532