题目描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
题解
这类题的通用解法就是回溯,回溯算法的通用解法:
res=[]
def backtrack(nums,start,path)//(选择列表,选择开始位置,选择的路径)
if 满足结束条件:
res.add(path)
return
for 选择 in 选择列表
选择
backtrack(nums,start+1,path);
撤销选择
代码
- Java
class Solution {
List<List<Integer>>res=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
List<Integer> path=new ArrayList<>();
backtrace(0,path,nums);
return res;
}
void backtrace(int start,List<Integer> path,int[] nums){
res.add(new ArrayList<>(path));
for(int i=start;i<nums.length;++i){
path.add(nums[i]);
backtrace(i+1,path,nums);
path.remove(path.size()-1);
}
}
}
- C++
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> subsets(vector<int>& nums) {
vector<int>track;
backtrack(nums,0,track);
return res;
}
void backtrack(vector<int> nums, int start, vector<int> track) {
res.push_back(track);
for (int i = start; i < nums.size(); i++) {
track.push_back(nums[i]);
backtrack(nums, i + 1, track);
track.pop_back();
}
}
};