90. Subsets II

来源:互联网 发布:vc和vb的功效 编辑:程序博客网 时间:2024/06/05 22:53

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

[  [2],  [1],  [1,2,2],  [2,2],  [1,2],  []]

Subscribe to see which companies asked this question

简单的backtracking,主要在于判断条件,一开始简单加了一句if(nums[i]==nums[i-1]) continue; 发现把其他分支也剪掉了。

应该写成if(i!=index&&nums[i]==nums[i-1]) continue; 意即在本层已经压入过相同的数了,后面的数不必再操作。

还有就是一个提升时间的小tips:对于{}的问题,一开始在主函数里对res压入一个{},然后调用dfs的时候结束条件为if(index>=nums.size()) return; 然后在循环中每次向res中压入一个解,一开始这样做的时间是9ms,但是如果将压{}的过程合并到dfs中的话,结果就是6ms。

class Solution {public:    vector<vector<int>> res;    vector<vector<int>> subsetsWithDup(vector<int>& nums) {                sort(nums.begin(),nums.end());                vector<int> sub;                dfs(nums, sub, 0);                return res;    }        void dfs(vector<int>& nums, vector<int>& sub, int index){                if(index>nums.size()) return;//因为压入的是上一轮的解,因此当index=nums.size的时候也应该执行函数,不能return        res.push_back(sub);//在这里压入上一轮的解                for(int i=index; i!=nums.size(); i++){            if(i!=index&&nums[i]==nums[i-1]) continue;            sub.push_back(nums[i]);            dfs(nums, sub, i+1);            sub.pop_back();        }    }};


0 0