90. Subsets II
90. Subsets II
题目
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2], a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
解析
- [LeetCode] Subsets II 子集合之二 使用非递归迭代和递归实现
从前往后遍历,保留下当前已经计算好的组合集合。对当前i号元素的加入,就是有i和没有i的场景。没有i的场景就是已有的集合。有i的就是对已有的集合追加上i后的集合。两个的并集就是加入i之后的结果。
如果i和上一个元素是重复的,则只需要考虑i-1加入过集合的那部分子集。对于不包含i-1元素的场景来说,这部分子集加入i的结果集,和已有的加入过i-1的结果集是重复的。所有跳过这部分就可以了。
// 90. Subsets II
class Solution_90 {
public:
void dfs(vector<vector<int>> &res,vector<int> &out,vector<int>&nums,int pos)
{
res.push_back(out);
for (int i = pos; i < nums.size();i++)
{
out.push_back(nums[i]);
dfs(res, out, nums, i + 1);
out.pop_back();
while ((i+1)<nums.size()&&nums[i+1]==nums[i])
{
i++;
}
}
return;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> res;
vector<int> out;
if (nums.empty())
{
return res;
}
sort(nums.begin(),nums.end());
dfs(res, out, nums, 0);
return res;
}
};
题目来源
C/C++基本语法学习
STL
C++ primer