[ 78 ] 动态规划 解题思路
- 用 res 存放结果,{ } 是任何集合的子集 ,res ={{}}
对于集合中每一个元素, 我们遍历res,将该元素 加到原有的子集中,产生新的子集, 将产生的新子集加入到res中
For example, If nums = [1,2,3]
第一个元素 1: {}+1 产生子集 {1}; res={{},{1}}第二个元素 2 : 产生子集 {2}, {1,2}; res={{},{1},{2},{1,2}};
以此类推,可以得到所有子集
- 具体代码如下:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res={{}};
if(!nums.empty()){
for(int i=0; i<nums.size(); i++){
for(int j=res.size()-1; j>=0; j--){ //遍历res, 将nums[i]加入到原有子集中,产生新的子集
vector<int> a=res[j];
a.push_back(nums[i]);
res.push_back(a);
}
}
}
return res;
}
};
[ 90 ] 动态规划 解题思路
思路与 [78] 一样 ,用 res 存放结果,{ } 是任何集合的子集 ,res ={{}}
由于存在重复元素, 要避免产生重复的子集。 方法如下:
For example, If nums = [1,2,2]
第一个元素 1: {}+1 产生子集 {1}; res={{},{1}}
第二个元素 2 : 产生2个子集 {2}, {1,2}; res={{},{1},{2},{1,2}};
第三个元素 2: 要不能加入到 上一个2 加入之前 的所有子集中, 即不能加入到 {{},{1}} 只能加入到上一个2 产生的子集以避免重复。 即产生的新子集 只有 {2,2},{1,2,2}
这种方法要求重复数字是相邻的,所以要先排序
- 代码如下 :
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> res={};
sort(nums.begin(), nums.end());
int temp;
int cnt=0;
if(!nums.empty()){
for(int i=0; i<nums.size(); i++){
temp=0;
if(i>0 && nums[i]==nums[i-1]) //出现重复数字,只加入到上一个数字产生的子集中
temp=res.size()-cnt;
cnt=0; //统计产生的新子集数
for(int j=res.size()-1; j>=temp; j--){
vector<int> a=res[j];
a.push_back(nums[i]);
res.push_back(a);
cnt++;
}
}
}
return res;
}