アイデア: バックトラックのアイデアを使用すると、各レベルには 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));
}
}