1. 程式人生 > >LeetCode題解--90. 子集 II

LeetCode題解--90. 子集 II

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; } } };