题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解题思路:递归+回溯
具体算法如下:
- 初始变量:
- tem:保存nums的一个子集
- result:保存所有的子集
- 定义递归函数,process(int nums,int cur):
- 在递归函数中选择将nums[cur]加入子集中或者不加入子集中
- 递归终止的条件,如果cur >= nums.length,return
- 否则:
- tem.add(nums[cur]):将nums[cur]加入子集中
- result.add(new ArrayList<>(tem)):tem此时保存的就是一个子集,加入到result中
- process(nums,cur+1):选择下一个加入子集中的元素
- 回溯:
- tem.remove(tem.size()-1):将nums[cur]从子集中移除,也就是不选择nums[cur]
- process(nums,cur+1)
因为每次是从当前为止往后将元素加入到子集中,最终结果不会重复
AC代码:
class Solution {
List<List<Integer>> result;
List<Integer> tem;
public List<List<Integer>> subsets(int[] nums) {
result = new ArrayList<>();
tem = new ArrayList<>();
result.add(new ArrayList<>());
process(nums, 0);
return result;
}
public void process(int[] nums, int cur) {
if (cur >= nums.length) {
return;
}
tem.add(nums[cur]);
result.add(new ArrayList<>(tem));
process(nums, cur + 1);
tem.remove(tem.size()-1);
process(nums, cur + 1);
}
}