不知道為什么看到這道題就很頭痛……
其實只要掌握nums不包含重復元素的情況下的代碼就行了。
若nums不能包含重復元素,那么使用回溯很容易就能寫出來:
class Solution {void hs(vector<int> v,int x,vector<int> r,vector<vector<int>>& result){if(x==v.size()){result.push_back(r);r.clear();return ;}r.push_back(v[x]);hs(v,x+1,r,result);r.pop_back();hs(v,x+1,r,result);}
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<int> r;vector<vector<int>> result;hs(nums,0,r,result);return result;}
};
一開始我在回溯的函數里鬼使神差寫了一個循環導致結果多出一大堆……以后可千萬不能犯這樣的低級錯誤了…………
接著就是考慮nums中能有重復元素的情況,這種情況下若重復元素上一個相同元素沒有選上,那么以后的這個元素也不能選,知道這個原理就可以將nums排序,讓重復元素互相挨著,每次不選上一個元素,若下一個元素還是這個元素就跳過不取。
class Solution {void hs(vector<int> v,int x,vector<int> r,vector<vector<int>>& result){if(x==v.size()){result.push_back(r);r.clear();return ;}r.push_back(v[x]);hs(v,x+1,r,result);r.pop_back();for(int i=x;i<v.size()-1;i++){if(v[x]==v[x+1]) x++;}hs(v,x+1,r,result);}
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<int> r;vector<vector<int>> result;sort(nums.begin(),nums.end());hs(nums,0,r,result);return result;}
};