今年许嵩巡回演唱会的最后一站是合肥站,巡演一共五场,很显然许嵩的进步是有目共睹的,期待更好的许嵩,也期待更好的自己,向优秀者看齐,是笔者今生不懈努力的方向。言归正传,下面就和大家分享一下刚刷这道题的经验吧!
题目如下:
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.
Example:
Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
题意分析:
给定一个整数集合nums(可能包含相同元素),请返回其所有的子集(空集也算,但重复子集不算)。
方法一(递归回溯法)
本题可借鉴“https://blog.csdn.net/Vensmallzeng/article/details/96709963”的方法一思路,但需要考虑去重的问题,本方法开始考虑在新定义的FindsubsetsWithDup函数中用“if(i>start && nums[i]==nums[start]) continue;”去过滤掉重复子集,后来发现有一小部分根本去不掉,于是改变思路先将nums进行排序,然后采用set类型的变量res用于过滤掉重复子集,最后将所得的res变成vector<vector<int>>返回即可。
解题代码如下:
class Solution{
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums){
set<vector<int>> res;
vector<int> temp;
if (nums.size()==0) return {{}};
sort(nums.begin(), nums.end());
FindsubsetsWithDup(nums, 0, temp, res);
return vector<vector<int>>(res.begin(), res.end());
}
void FindsubsetsWithDup(vector<int>& nums, int start, vector<int>& temp, set<vector<int>>& res){
res.insert(temp);
for (int i = start; i < nums.size(); i++) {
temp.push_back(nums[i]);
FindsubsetsWithDup(nums, i+1, temp, res);
temp.pop_back();
}
}
};
提交后的结果如下:
方法二(非递归法)
基于“https://blog.csdn.net/Vensmallzeng/article/details/96709963”的方法二进行去重操作即可解决本题。为了去重,首先需要对nums进行排序,然后通过定义了一个set<vector<int>>型的变量temp,将所得res的结果进行去重,最后将temp转成vector<vector<int>>型并返回即可。
解题代码如下:
class Solution{
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums){
vector<vector<int>> res(1);
set<vector<int>> temp;
if(nums.size()==0) return res;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
int size = res.size();
for (int j = 0; j < size; ++j) {
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
temp = set<vector<int>>(res.begin(), res.end());
return vector<vector<int>>(temp.begin(), temp.end());
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。