90. Subsets II
仅供自己学习
思路:
这个类似的题都是可以采用递归的方法。因为这里涉及到去重,他的去重是指[1,2]和[2,1]同时存在res数组里面,而不是如[1,2,2]里面不能有重复元素。那么我们去重复结果的做法就是先将nums排序,然后进入递归,我们每次递归传入的开始的位置为该次位置start+1,进入递归先把这个结果加入res数组,然后for循环遍历start到最后一个元素,然后判断i是不是大于start,并且nums[i]==nums[i-1]这里判断 i是否大于start要放在前面,因为对于 i=0,没有i-1,i>start这个条件就是为了避免这个清况。如果满足这两个条件说明这个数将会得到的结果与上一个循环获得的结果重复了,所以要跳过。否则就将这个数加入进path临时结果数组中,在进入递归,当递归出来后就将这个元素从path中pop掉。
代码:
1 class Solution { 2 private: 3 vector<vector<int>> res; 4 vector<int> path; 5 void backtracking(vector<int>& nums,int start){ 6 res.push_back(path); 7 for(int i=start;i<nums.size();++i){ 8 if( i> start&&nums[i]==nums[i-1]) continue; 9 path.push_back(nums[i]); 10 backtracking(nums,i+1); 11 path.pop_back(); 12 } 13 } 14 public: 15 vector<vector<int>> subsetsWithDup(vector<int>& nums) { 16 sort(nums.begin(),nums.end()); 17 backtracking(nums,0); 18 return res; 19 } 20 };