LeetCode題解--90. 子集 II
阿新 • • 發佈:2019-02-10
1. 題目
給定一個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:
輸入: [1,2,2]
輸出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
2. 分析
參考題目78。
這個題會出現的一個問題就是重複,例如給定輸入【4,4,4,1,4】
按照之前78的程式,會同時給出【4,4,4,1】和【4,4,1,4】,然而這兩個結果實際上是一個結果。出現這個問題的原因在於每一個子集是通過vector儲存的,雖然從我們的觀察角度這兩個結果相等,但是由於vector儲存,所以通過去重不能將這兩個結果合二為一。
解決這個問題的措施就是在每次得到一個子集的時候,然後插入到最終的結果中。那麼前面提到的兩個例子【4,4,4,1】和【4,4,1,4】都會變成【1,4,4,4】,這樣就能夠去重了。
3. 技術記錄
對vector進行排序
sort(vec.begin(),vec.end());
對vector進行去重
sort(vec.begin(),vec.end());
vector<型別>::iterator it = unique(vec.begin(),vec.end());
vec.erase(it,vec.end());
4. C++程式
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector <vector<int>> res;
vector<int> flag;
for(int i=0;i<nums.size();i++){
flag.push_back(0);
}
dfs(0,nums,flag,res);
sort(res.begin(),res.end());
vector<vector<int>>::iterator iter = unique(res.begin(),res.end());
res.erase(iter,res.end());
return res;
}
void dfs(int loc,vector<int> nums,vector<int> flag,vector<vector<int>>& res){
if(loc>=nums.size()){
vector<int> temp;
for(int i=0;i<nums.size();i++){
if(flag[i]==1) temp.push_back(nums[i]);
}
sort(temp.begin(),temp.end());
res.push_back(temp);
return;
}
for(int i=0;i<2;i++){
int old = flag[loc];
flag[loc] = i;
dfs(loc+1,nums,flag,res);
flag[loc] = old;
}
}
};