// 和 47. 全排列 II 题类似
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> res;
vector<int> tmp;
if (nums.size() <= 0)
return res;
// 先排序
sort(nums.begin(), nums.end());
solve(0, tmp, res, nums);
return res;
}
// 确保从start开始的一个子集里面,在end这个数前面没有和end相同的数
bool check(int start, int end, vector<int>& nums){
int num = nums[end];
for (int i = start; i < end; i++)
if (nums[i] == num)
return false;
return true;
}
void solve(int index, vector<int>& tmp, vector<vector<int>>& res, vector<int>& nums){
//当数字全部被选完了就直接退出
if (tmp.size() == nums.size()){
res.push_back(tmp);
return;
}else
// 否则就当作一个子集存入
res.push_back(tmp);
for (int i = index; i < nums.size(); i++){
if (check(index, i, nums)){
tmp.push_back(nums[i]);
solve(i + 1, tmp, res, nums);
tmp.pop_back();
}
}
return;
}
};
static int x=[](){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
LetCode 90. 子集 II
最新推荐文章于 2024-06-02 14:57:21 发布