サブセット (LeetCode)

アイデア: バックトラックのアイデアを使用すると、各レベルには 2 つの選択肢があります。要素を選択するか、要素を選択しません。そうでない場合は、直接次のレベルに進みます。選択した場合は、要素をリストに入れて次のレベルに進みますただし、要素を選択しないブランチが確実に存在するようにするには、要素をリストから削除する必要があります。再帰呼び出しを続けます。最後に、index の値が配列の長さと等しい場合、再帰は停止します。リストを 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