目录
78. 子集:
问题描述:
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
实现代码与解析:
回溯:
class Solution {
public:
vector<int> path;//记录路径
vector<vector<int>> result;//记录结果
void backtracking(vector<int> nums,int startIndex)
{
result.push_back(path);
for(int i=startIndex;i<nums.size();i++)
{
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums)
{
backtracking(nums,0);
return result;
}
};
原理思路:
一般的回溯题是收集叶子结点,而此题要收集的是所有结点,所以我们直接在递归开头把收集结点的代码写上就行,也不用在开头写终止条件,让其在结尾自动终止即可,其他的就和一般的回溯题相同了。
90. 子集 II:
题目描述:
给你一个整数数组 nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2] 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
实现代码与解析:
回溯:
class Solution {
public:
vector<int> path;//记录路径
vector<vector<int>> result;//记录结果
void backtracking(vector<int> nums,int startIndex)
{
result.push_back(path);
for(int i=startIndex;i<nums.size();i++)
{
if(i>startIndex&&nums[i]==nums[i-1]) continue;
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
return;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums)
{
sort(nums.begin(),nums.end());
backtracking(nums,0);
return result;
}
};
原理思路:
相比于上一题,多了个去重而已,在Leetcode:39. 组合总和、40. 组合总和 II(C++)_Cosmoshhhyyy的博客-CSDN博客中有具体的去重讲解。