【subset I】问题:
Given a set of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
分析:
1、求一组不重复的整数的所有子集;
2、迭代
代码:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res(1,vector<int>());
int m=nums.size();
for(int i=0;i<m;i++){
int n=res.size();
for(int j=0;j<n;j++){
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
return res;
}
};
【subset II】问题:
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
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], [] ]
分析:
1、现在这组整数允许有重复值;
2、迭代
3、举例[1 2 2]来分析:处理第一个2时子集合为[], [1], [2], [1, 2],而这时再处理第二个2时,如果在[]和[1]后直接加2会产生重复,所以只能在上一个循环生成的后两个子集合后面加2。不重复的条件就是:nums[i]!=nums[i]或者j>pre (其中j从0到res.size(),pre是之前res的大小)
代码:
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res(1,vector<int>());
int m=nums.size();
int pre=0;
for(int i=0;i<m;i++){
int n=res.size();
for(int j=0;j<n;j++){
if(i==0||nums[i]!=nums[i-1]||j>=pre){
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
pre=n;
}
return res;
}
};