class Solution {
public List<List<Integer>> subsets(int[] nums) {
// 创建一个用于存储所有子集的结果列表
List<List<Integer>> result = new ArrayList<>();
// 检查输入数组是否为空 如果为空 则直接返回结果列表
if(nums == null || nums.length == 0){
return result;
}
//调用回溯函数 从数组的第一个元素开始
backtrack(result, new ArrayList<>(), nums,0);
return result;
}
private void backtrack(List<List<Integer>> result, List<Integer> tempList, int[] nums, int start){
// 将当前的子集添加到结果列表中
result.add(new ArrayList<>(tempList));
// 遍历数组的所有元素
for(int i = start; i< nums.length;i++){
// 将当前元素添加到子集中
tempList.add(nums[i]);
// 调用回溯函数 从下一个元素开始
backtrack (result, tempList, nums, i+1);
// 在回到这一层的递归后 撤销上一步的操作
tempList.remove(tempList.size()-1);
}
}
}
首先会检查输入的数组是否为空,如果为空则直接返回一个空的结果集。然后,它会使用回溯方法(backtrack)来生成所有可能的子集。在每一次递归调用中,它都会将当前的临时列表(tempList)添加到结果集中,然后尝试将当前元素添加到临时列表中,并进入下一层递归。在回到这一层递归后,它会撤销上一步的操作(即将当前元素从临时列表中移除),以便在下一次循环中尝试不添加当前元素。